最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類與對象深入之靜態(tài)成員與友元及內(nèi)部類詳解

 更新時(shí)間:2022年06月10日 08:54:27   作者:Rookiep  
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對我們對C++的靜態(tài)成員,友元,內(nèi)部類知識點(diǎn)做出總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步

一:靜態(tài)成員

靜態(tài)成員就是在成員變量和成員函數(shù)前加上關(guān)鍵字static,稱為靜態(tài)成員。C++里面盡量用靜態(tài)成員變量代替全局變量。

1.1:靜態(tài)成員分類

1?靜態(tài)成員變量:

  • 所有對象共享同一份數(shù)據(jù)
  • 在編譯階段分配內(nèi)存
  • 類內(nèi)聲明,類外初始化

靜態(tài)成員函數(shù)

  • 所有對象共享同一個(gè)函數(shù)
  • 靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量

1.2:靜態(tài)成員變量

class Person
{
public:
	static int m_A; //靜態(tài)成員變量
private:
	static int m_B; //靜態(tài)成員變量也是有訪問權(quán)限的
};
int Person::m_A = 10;
int Person::m_B = 10;
void test01()
{
	//靜態(tài)成員變量兩種訪問方式
	//1、通過對象
	Person p1;
	p1.m_A = 100;
	cout << "p1.m_A = " << p1.m_A << endl;
	Person p2;
	p2.m_A = 200;
	cout << "p1.m_A = " << p1.m_A << endl; //共享同一份數(shù)據(jù)
	cout << "p2.m_A = " << p2.m_A << endl;
	//2、通過類名
	cout << "m_A = " << Person::m_A << endl;
	//cout << "m_B = " << Person::m_B << endl; //私有權(quán)限訪問不到
}
int main() {
	test01();
	system("pause");
	return 0;
}

代碼解釋:上述代碼我們主要驗(yàn)證了利用兩種方式來訪問靜態(tài)成員變量,以及靜態(tài)成員變量屬于整個(gè)類,屬于類的所有對象

1.3:靜態(tài)成員函數(shù)

class Person
{
public:
	static void func()
	{
		cout << "func調(diào)用" << endl;
		m_A = 100;
		//m_B = 100; //錯(cuò)誤,不可以訪問非靜態(tài)成員變量
	}
	static int m_A; //靜態(tài)成員變量
	int m_B; // 
private:
	//靜態(tài)成員函數(shù)也是有訪問權(quán)限的
	static void func2()
	{
		cout << "func2調(diào)用" << endl;
	}
};
int Person::m_A = 10;
void test01()
{
	//靜態(tài)成員變量兩種訪問方式
	//1、通過對象
	Person p1;
	p1.func();
	//2、通過類名
	Person::func();
	//Person::func2(); //私有權(quán)限訪問不到
}
int main() {
	test01();
	system("pause");
	return 0;
}

代碼解釋:上述代碼我們主要驗(yàn)證了利用兩種方式來訪問靜態(tài)成員函數(shù),利用對象訪問和利用類名訪問,以及靜態(tài)成員函數(shù)只可以訪問靜態(tài)成員變量

??????:為什么不可以訪問非靜態(tài)成員?

??因?yàn)闆]有this指針

1.4:總結(jié)特性

  1. 靜態(tài)成員為所有類對象所共享,不屬于某個(gè)具體的類實(shí)例
  2. 靜態(tài)成員變量必須在類外定義,定義時(shí)不加static關(guān)鍵字
  3. 類靜態(tài)成員類名::靜態(tài)成員或者對象.靜態(tài)成員來訪問
  4. 靜態(tài)成員函數(shù)沒有隱含的this指針,不可以訪問任何非靜態(tài)成員
  5. 靜態(tài)成員和類的普通成員也一樣,也有三種訪問權(quán)限,也可以有返回值。

1.5:試題示例

?實(shí)現(xiàn)一個(gè)類,計(jì)算程序中創(chuàng)建了多少個(gè)類對象

class A
{
public:
	A(){
		++_count1;
	}
	A(const A& aa){
		++_count2;
	}
	// 成員函數(shù)也可以是靜態(tài),static成員函數(shù)沒有this指針
	static int GetCount1(){
		return _count1;
	}
	static int GetCount2(){
		return _count2;
	}
//private:
	// 靜態(tài)成員變量屬于整個(gè)類,所以類的所有對象
	static int _count1;
	static int _count2; // 聲明
};
// 定義
int A::_count1 = 0;
int A::_count2 = 0;
A Func(A a)
{
	A copy(a);
	return copy;
}
int main()
{
	A a1;
	A a2 = Func(a1);
	cout << a1._count1 << endl;
	cout << a2._count1 << endl;
	cout << a1._count2 << endl;
	cout << a2._count2 << endl;
	cout << A::_count1 << endl;
	cout << A::_count2 << endl;
	cout << a1.GetCount1() << endl;
	cout << a2.GetCount2() << endl;
	cout << A::GetCount1() << endl;
	cout << A::GetCount2() << endl;
	system("pause");
	return 0;
}

1
1
3
3
1
3
1
3
1
3
請按任意鍵繼續(xù). . .

1.6:C++11成員初始化新玩法

class B
{
public:
	B(int b = 0)
		:_b(b)
	{}
	int _b;
};
class A
{
public:
	//A()//其實(shí)是編譯器自己生產(chǎn)的默認(rèn)構(gòu)造函數(shù)用缺省值初始化
	//	:a(10)
	//	, b(20)
	//	, p((int*)malloc(4))
	//{}
	void Print()
	{
		cout << a << endl;
		cout << b._b << endl;
		cout << p << endl;
		cout << n << endl;
	}
private:
	// 非靜態(tài)成員變量,可以在成員聲明時(shí)給缺省值。
	int a = 10;
	B b = 20;//單參數(shù)的構(gòu)造函數(shù),支持隱式類型的轉(zhuǎn)換
	int* p = (int*)malloc(4);
	static int n;
	//非靜態(tài)成員變量定義在構(gòu)造函數(shù)
	//靜態(tài)在類外
};
int A::n = 0;
int main()
{
	A a;
	a.Print();
	system("pause");
	return 0;
}

二:友元

在程序里,有些私有屬性 也想讓類外特殊的一些函數(shù)或者類進(jìn)行訪問,就需要用到友元的技術(shù)

友元的目的就是讓一個(gè)函數(shù)或者類 訪問另一個(gè)類中私有成員

友元的關(guān)鍵字為friend

友元分為:

  • 友元函數(shù)
  • 友元類

友元的三種實(shí)現(xiàn):

全局函數(shù)做友元

類做友元

成員函數(shù)做友元

2.1:全局函數(shù)做友元

??說明:友元函數(shù)可以直接訪問類的私有成員,它是定義在類外部的普通成員函數(shù),不屬于任何類,但需要在類的內(nèi)部聲明,聲明的時(shí)候需要加friend關(guān)鍵字。

class Building
{
	//告訴編譯器 goodGay全局函數(shù) 是 Building類的好朋友,可以訪問類中的私有內(nèi)容
	friend void goodGay(Building * building);
public:
	Building(){
		this->m_SittingRoom = "客廳";
		this->m_BedRoom = "臥室";
	}
public:
	string m_SittingRoom; //客廳
private:
	string m_BedRoom; //臥室
};
void goodGay(Building * building){
	cout << "好基友正在訪問: " << building->m_SittingRoom << endl;
	cout << "好基友正在訪問: " << building->m_BedRoom << endl;
}
void test01(){
	Building b;
	goodGay(&b);
}
int main(){
	test01();
	system("pause");
	return 0;
}

代碼解釋:如上述代碼中,我們需要告訴編譯器 goodGay全局函數(shù) 是 Building類的好朋友,可以訪問類中的私有內(nèi)容

2.2:類做友元

友元類的所有成員函數(shù)都可以是另一個(gè)類的友元函數(shù),都可以訪問另一個(gè)類的非公有成員。

  • 友元關(guān)系是單向的,不具有交換性。
  • 友元關(guān)系不可以傳遞。如果B是A的友元,C是B的友元,但是不可以說C是A的友元。

代碼示例:

class Building;
class goodGay
{
public:
	goodGay();
	void visit();
private:
	Building *building;
};
class Building
{
	//告訴編譯器 goodGay類是Building類的好朋友,可以訪問到Building類中私有內(nèi)容
	friend class goodGay;
public:
	Building();
public:
	string m_SittingRoom; //客廳
private:
	string m_BedRoom;//臥室
};
Building::Building(){
	this->m_SittingRoom = "客廳";
	this->m_BedRoom = "臥室";
}
goodGay::goodGay(){
	building = new Building;
}
void goodGay::visit(){
	cout << "好基友正在訪問" << building->m_SittingRoom << endl;
	cout << "好基友正在訪問" << building->m_BedRoom << endl;
}
void test01(){
	goodGay gg;
	gg.visit();
}
int main(){
	test01();
	system("pause");
	return 0;
}

代碼解釋:如上述代碼中,我們需要告訴編譯器 告訴編譯器 goodGay類是Building類的好朋友,可以訪問到Building類中私有內(nèi)容

2.3:成員函數(shù)做友元

一個(gè)類的成員函數(shù)做另一個(gè)類的友元。

代碼示例:

class Building;//提前聲明
class goodGay
{
public:
	goodGay();
	void visit(); //只讓visit函數(shù)作為Building的好朋友,可以發(fā)訪問Building中私有內(nèi)容
	void visit2(); 
private:
	Building *building;
};
class Building
{
	//告訴編譯器  goodGay類中的visit成員函數(shù) 是Building好朋友,可以訪問私有內(nèi)容
	friend void goodGay::visit();
public:
	Building();
public:
	string m_SittingRoom; //客廳
private:
	string m_BedRoom;//臥室
};
Building::Building(){
	this->m_SittingRoom = "客廳";
	this->m_BedRoom = "臥室";
}
goodGay::goodGay(){
	building = new Building;
}
void goodGay::visit(){
	cout << "好基友正在訪問" << building->m_SittingRoom << endl;
	cout << "好基友正在訪問" << building->m_BedRoom << endl;
}
void goodGay::visit2(){
	cout << "好基友正在訪問" << building->m_SittingRoom << endl;
	//cout << "好基友正在訪問" << building->m_BedRoom << endl;
}
void test01(){
	goodGay  gg;
	gg.visit();
}
int main(){  
	test01();
	system("pause");
	return 0;
}

代碼解釋:如上述代碼中,我們需要告訴編譯器 goodGay類中的visit成員函數(shù) 是Building好朋友,可以訪問私有內(nèi)容

三:內(nèi)部類

3.1:概念

概念:如果一個(gè)類定義在另一個(gè)類的內(nèi)部,這個(gè)類就叫內(nèi)部類。注意此時(shí)的內(nèi)部類是一個(gè)獨(dú)立的類,它不屬于外部類。更不可以通過外部類的對象去調(diào)用內(nèi)部類。外部類對內(nèi)部類沒有任何的訪問權(quán)限。

??下面我們看一段代碼:

// 內(nèi)部類
class A
{
private:
	static int k;
	int h;
public:
	// 內(nèi)部類
	class B // B天生就是A的友元
	{
	public:
		void foo(const A& a)
		{
			cout << k << endl;//OK
			cout << a.h << endl;//OK
		}
	private:
		int _b;
	};

	// A不是B的友元
	/*void Print(const B& b)
	{
	b._b = 0;
	}*/
};
int A::k = 1;
int main()
{
	A aa;
	cout << sizeof(A) << endl;
	A::B bb;
	return 0;
}

代碼解釋:如上述代碼中,對于此處的內(nèi)部類,B天生就是A的友元,所以在B類中可以訪問A類的私有成員,但是A不是B的友元。如果內(nèi)部類是公有屬性的話,我們還可以實(shí)例化內(nèi)部類對象。

3.2:特性

??????特性:

  • 內(nèi)部類可以定義在外部類的public、protected、private都是可以的。
  • 注意內(nèi)部類可以直接訪問外部類中的static、枚舉成員,不需要外部類的對象/類名。
  • sizeof(外部類) = 外部類,和內(nèi)部類沒有任何關(guān)系。

到此這篇關(guān)于C++類與對象深入之靜態(tài)成員與友元及內(nèi)部類詳解的文章就介紹到這了,更多相關(guān)C++類與對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++LeetCode數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解

    C++LeetCode數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode數(shù)據(jù)結(jié)構(gòu),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言中數(shù)據(jù)如何存儲進(jìn)內(nèi)存揭秘

    C語言中數(shù)據(jù)如何存儲進(jìn)內(nèi)存揭秘

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08
  • C++實(shí)現(xiàn)商店倉庫管理系統(tǒng)

    C++實(shí)現(xiàn)商店倉庫管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)商店倉庫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言計(jì)算器的3種實(shí)現(xiàn)方法代碼

    C語言計(jì)算器的3種實(shí)現(xiàn)方法代碼

    這篇文章主要給大家介紹了關(guān)于C語言計(jì)算器的3種實(shí)現(xiàn)方法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一的參考借鑒價(jià)值,需要的朋友可以參考下
    2007-01-01
  • 對C語言中指針的理解與其基礎(chǔ)使用實(shí)例

    對C語言中指針的理解與其基礎(chǔ)使用實(shí)例

    這篇文章主要介紹了對C語言中指針的理解與其基礎(chǔ)使用實(shí)例,文中援引了知乎熱門問題"為什么說指針是 C 語言的精髓?"中的精彩回答,需要的朋友可以參考下
    2016-03-03
  • c++判斷文件是否存在的方法匯總

    c++判斷文件是否存在的方法匯總

    這篇文章主要介紹了c++判斷文件是否存在的方法匯總,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當(dāng)今市場狀況,各種培訓(xùn)班飛起,PHPer越來越多,學(xué)習(xí)成本很低。導(dǎo)致了很多人對PHP的誤解。其實(shí)PHP學(xué)到深入的時(shí)候,所需知識很多,并不是表面看到的那樣。另外,PHP確實(shí)嚴(yán)謹(jǐn)性不高,這個(gè)跟C++,java確實(shí)都沒法比。但是,PHP在web開發(fā)中的效率,是其他語言所不能比的
    2017-02-02
  • 淺談C語言的字符串分割

    淺談C語言的字符串分割

    下面小編就為大家?guī)硪黄獪\談C語言的字符串分割。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • 關(guān)于C語言strlen與sizeof區(qū)別詳情

    關(guān)于C語言strlen與sizeof區(qū)別詳情

    對于 strlen 和 sizeof,相信不少程序員會(huì)混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別,今天得這篇文章我們就來學(xué)習(xí)C語言strlen與sizeof區(qū)別的相關(guān)資料,需要的朋友可以參考一下
    2021-10-10
  • C++ STL中常見的算法使用方式

    C++ STL中常見的算法使用方式

    這篇文章主要介紹了C++ STL中常見的算法使用方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評論

金乡县| 通城县| 海宁市| 黄平县| 类乌齐县| 若尔盖县| 大化| 连云港市| 龙江县| 新昌县| 曲麻莱县| 彭州市| 衡山县| 江陵县| 铜鼓县| 星座| 大冶市| 平陆县| 余庆县| 山西省| 个旧市| 历史| 九江县| 禄丰县| 新晃| 江源县| 靖安县| 丁青县| 南澳县| 和田县| 磴口县| 湘阴县| 饶平县| 棋牌| 巴楚县| 宕昌县| 西贡区| 乌鲁木齐县| 迁安市| 朝阳区| 平舆县|