国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++:初始化列表,static成員,友元,內(nèi)部類

這篇具有很好參考價值的文章主要介紹了C++:初始化列表,static成員,友元,內(nèi)部類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

個人主頁 : 個人主頁
個人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》《C++》


前言

本篇博客作為C++:初始化列表,static成員,友元,內(nèi)部類的知識總結(jié)。


一、初始化列表

初始化列表:以冒號開始,接著是一個以逗號分隔的數(shù)據(jù)成員列表,每個“成員變量”后面跟一個放在括號中的初始值或表達(dá)式。
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言


  • 初始化列表是每個成員變量定義的地方
  • 每個成員變量在初始化列表中只能出現(xiàn)一次,也就是每個對象的成員變量只能定義一次

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言


  • 引用成員變量,const成員變量,自定義類型成員(沒有默認(rèn)構(gòu)造函數(shù)的)必須在初始化列表位置進(jìn)行初始化
class B
{
public:
	B(int b)
		:_b(b)
	{}

private:
	int _b;
};

class A
{
public:
	A(int a, int& i)
		:_a(a) // const成員變量
		,_reti(i)// 引用類型成員變量
		,_b(1)//  自定義類型成員
	{}

private:
	const int _a;
	int& _reti;

	B _b;
};

對于const成員變量,引用成員變量必須在定義時初始化賦值,自定義類型成員在定義時會調(diào)用對應(yīng)的默認(rèn)構(gòu)造函數(shù),如果沒有默認(rèn)構(gòu)造函數(shù)就需要在定義時顯示調(diào)用對應(yīng)的構(gòu)造函數(shù),而初始化列表就是對象的成員變量定義的地方。


  • 構(gòu)造函數(shù)賦初值和初始化列表初始化混用

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言


  • 盡量使用初始化列表,因為不管你是否使用初始化列表,對于自定義類型成員變量,一定會優(yōu)先使用初始化列表進(jìn)行初始化

  • 成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后次序無關(guān)

下面程序的結(jié)果是?

class A
{
public:
	A(int a)
		:_a1(a)
		,_a2(_a1)
	{}

	void Print()
	{
		cout << "_a1 = " << _a1 << endl;
		cout << "_a2 = " << _a2 << endl;
	}

private:
	int _a2;
	int _a1;
};

int main()
{
	A a(1);
	a.Print();

	return 0;
}

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
這就是因為,成員變量初始化的順序與成員聲明的順序有關(guān),我們先聲明了成員變量a2,在聲明成員變量a1。那么在初始化成員列表中我們先執(zhí)行_a2(_a1),此時_a1是隨機值,所以打印結(jié)果中_a1是1,_a2是隨機值。


注意:C++11支持給成員變量聲明缺省值,這個缺省值是給初始化列表使用。

二、static成員

聲明為static的類成員稱為類的靜態(tài)成員,用static修飾的成員變量,稱為靜態(tài)成員變量;用static修飾的成員函數(shù),稱為靜態(tài)成員函數(shù),靜態(tài)成員變量一定要在類外進(jìn)行初始化。

問題:實現(xiàn)一個類,計算程序中正在使用的類對象個數(shù)

class A
{
public:
	A()
	{
		_count++;
	}

	A(const A& a)
	{
		_count++;
	}

	~A()
	{
		_count--;
	}

	int get_count()
	{
		return _count;
	}
private:
	static int _count;
};

int A::_count = 0;

這里我們就需要使用static成員變量,在每次調(diào)用構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)時_count++,每次調(diào)用析構(gòu)函數(shù)時_count–。


  • 靜態(tài)成員為所有類對象共享,不屬于某個具體的對象,存放在靜態(tài)區(qū)

下面類A的大小是多少?

class A
{
private:
	static int i;
};

int main()
{
	cout << sizeof(A) << endl;

	return 0;
}

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
A類的大小為1,也就是空類。

  • 靜態(tài)成員變量必須在類外定義,定義時不添加static關(guān)鍵詞,類中只是聲明
  • 類靜態(tài)成員即可用 類名::靜態(tài)成員 或者 對象.靜態(tài)成員來訪問

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

  • 靜態(tài)成員函數(shù)沒有隱藏的this指針,不能訪問任何非靜態(tài)成員

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

  • 靜態(tài)成員也是類成員,受public,protected,private訪問限定符的限制

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
如果想訪問靜態(tài)成員 i,可以實現(xiàn)Geti()等函數(shù)來訪問
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

三、友元

友元分為友元函數(shù)和友元類

友元函數(shù)
例如我們要對日期類重載<<操作符時,會發(fā)現(xiàn)無法將operator<<重載為成員函數(shù),因為隱含的this指針占據(jù)了operator<<函數(shù)的第一個參數(shù)位置。這樣重載的<<操作符就無法正常使用。
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
當(dāng)然我們可以 d << cout這樣使用,但是不是有點怪?
這是我們就需要將operator<<重載成全局函數(shù),但成為全局函數(shù)時就無法訪問對象的成員變量,此時就需要友元類解決(使用GetYear / GetMonth / GetDay函數(shù)也可以解決)。

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

class Date
{
	friend ostream& operator<<(ostream& _cout, const Date& d);

public:
	Date(int year = 0, int month = 0, int day = 0)
		:_year(year)
		,_month(month)
		,_day(day)
	{}

private:
	int _year;
	int _month;
	int _day;
};

ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "/" << d._month << "/" << d._day;

	return _cout;
}
int main()
{
	Date d(2023, 9, 16);
	cout << d;

	return 0;
}

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

  • 友元函數(shù)可訪問類的私有和保護成員,但不是類的成員函數(shù)
  • 友元函數(shù)不能用const修飾
  • 友元函數(shù)可以在類定義的任何地方聲明,不受類訪問限定符限制
  • 一個函數(shù)可以是多個類的友元函數(shù)
  • 友元函數(shù)的調(diào)用原理與普通函數(shù)的調(diào)用原理相同
  • 友元函數(shù)沒有this指針
  • C++規(guī)定=,[ ],(),->這四個運算符只能被重載為類的非靜態(tài)成員函數(shù),其他的可以被友元重載,主要是因為其他的運算符重載函數(shù)都會根據(jù)參數(shù)類型或數(shù)目進(jìn)行精確匹配,這四個不具有這種檢查的功能,用友元定義就會出錯。

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

  • 友元關(guān)系是單向的,不具備交換性
    如下:B是A的友元類,B類可以訪問A類的成員變量,A類不能訪問B類的成員變量
    C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
    C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

  • 友元關(guān)系不能傳遞

  • 友元關(guān)系不能繼承

四、內(nèi)部類

內(nèi)部類:如果一個類定義在另一個類的內(nèi)部,這個類就叫左內(nèi)部類。內(nèi)部類是一個獨立的類,它不屬于外部類,更不能通過外部類的對象去訪問內(nèi)部類的成員。

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言
如圖:B是A的內(nèi)部類

注意:內(nèi)部類是外部類的友元類。內(nèi)部類可以通過外部類的對象參數(shù)來訪問外部類中的所以成員,但外部類不是內(nèi)部類的友元

  • 內(nèi)部類可以定義在外部類的public,protected,private中
  • 內(nèi)部類可以直接訪問外部類中的static成員,不需要外部類的對象. 和 類名::
class A
{
public:
	class B
	{
	public:
		void func(const A& a)
		{
			cout << i << endl;
			cout << a._a << endl;
		}
	};

	A()
	:_a(0)
	{}
private:
	static int i;
	int _a;
};

int A::i = 0;

int main()
{
	A::B b;
	b.func(A());
	return 0;
}

C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言

  • sizeof(外部類) = 外部類,和內(nèi)部類沒有任何關(guān)系
class A
{
public:
	class B
	{
	private:
		int _b;
	};

	A()
	:_a(0)
	{}
private:
	static int i;
	int _a;
};

上述類的大小是?
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言


總結(jié)

以上就是我對于初始化列表,static成員,友元,內(nèi)部類,匿名對象的知識總結(jié)。感謝支持?。?!
C++:初始化列表,static成員,友元,內(nèi)部類,C++,c++,開發(fā)語言,c語言文章來源地址http://www.zghlxwxcb.cn/news/detail-721965.html

到了這里,關(guān)于C++:初始化列表,static成員,友元,內(nèi)部類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【C++】類與對象 第三篇(初始化列表,explicit,static,友元,內(nèi)部類)

    【C++】類與對象 第三篇(初始化列表,explicit,static,友元,內(nèi)部類)

    目錄 再談構(gòu)造函數(shù) 構(gòu)造函數(shù)體賦值 初始化列表 explicit static成員 匿名對象 友元 友元函數(shù) 友元類 內(nèi)部類 拷貝對象時的一些編譯器優(yōu)化 在創(chuàng)建對象時,編譯器通過調(diào)用構(gòu)造函數(shù)給對象各個成員變量一個合適的初始值 雖然上述構(gòu)造函數(shù)調(diào)用之后,對象中已經(jīng)有了一個初

    2024年02月05日
    瀏覽(20)
  • 【C++練級之路】【Lv.4】類和對象(下)(初始化列表,友元,static成員,編譯器的優(yōu)化)

    【C++練級之路】【Lv.4】類和對象(下)(初始化列表,友元,static成員,編譯器的優(yōu)化)

    歡迎各位小伙伴關(guān)注我的專欄,和我一起系統(tǒng)學(xué)習(xí)C++,共同探討和進(jìn)步哦! 學(xué)習(xí)專欄 : 《進(jìn)擊的C++》 在創(chuàng)建對象時,編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個成員變量一個合適的初始值。 雖然上述構(gòu)造函數(shù)調(diào)用之后,對象中已經(jīng)有了一個初始值,但是不能將其稱為對對象

    2024年02月04日
    瀏覽(27)
  • 【C++技能樹】類和對象的使用 --初始化列表,static,友元,內(nèi)部類,匿名對象的理解與使用

    【C++技能樹】類和對象的使用 --初始化列表,static,友元,內(nèi)部類,匿名對象的理解與使用

    Halo,這里是Ppeua。平時主要更新C語言,C++,數(shù)據(jù)結(jié)構(gòu)算法…感興趣就關(guān)注我bua! 這是一個C++的默認(rèn)構(gòu)造函數(shù) 雖然我們大多時候混淆初始化與賦值的概念,但在這里,構(gòu)造函數(shù)體中只能成為 賦值 ,因為初始化只能初始化一次,而賦值可以賦值多次。 那么在哪里進(jìn)行初始化呢

    2024年02月06日
    瀏覽(33)
  • 4.【CPP】入門(初始化列表||explicit||static||友元||靜態(tài)成員變量/函數(shù))

    4.【CPP】入門(初始化列表||explicit||static||友元||靜態(tài)成員變量/函數(shù))

    我們知道在c++11中才能在成員對象聲明時初始化,像下面這樣。 注意:構(gòu)造函數(shù)不是初始化,而是賦初始值。那么在c++11以前該怎么初始化成員變量呢? 每個成員變量在初始化列表中只能出現(xiàn)一次(初始化只能初始化一次) 類中包含以下成員,必須放在初始化列表位置進(jìn)行初始

    2024年01月20日
    瀏覽(29)
  • 【C++那些事兒】深入理解C++類與對象:從概念到實踐(下)| 再談構(gòu)造函數(shù)(初始化列表)| explicit關(guān)鍵字 | static成員 | 友元

    【C++那些事兒】深入理解C++類與對象:從概念到實踐(下)| 再談構(gòu)造函數(shù)(初始化列表)| explicit關(guān)鍵字 | static成員 | 友元

    ?? 江池?。簜€人主頁 ?? 個人專欄:?C++那些事兒 ?Linux技術(shù)寶典 ?? 此去關(guān)山萬里,定不負(fù)云起之望 1.1 構(gòu)造函數(shù)體賦值 在創(chuàng)建對象時,編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個成員變量一個合適的初始值。 雖然上述構(gòu)造函數(shù)調(diào)用之后,對象中已經(jīng)有了一個初始值,但是

    2024年03月21日
    瀏覽(24)
  • C++——初始化列表 | explicit關(guān)鍵字 | static成員

    C++——初始化列表 | explicit關(guān)鍵字 | static成員

    ??作者簡介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學(xué)習(xí)。 ?? 本文收錄于 C++系列 ,本專欄主要內(nèi)容為 C++ 初階、C++ 進(jìn)階、STL 詳解等,專為大學(xué)生打造全套 C++ 學(xué)習(xí)教程,持續(xù)更新! ?? 相關(guān)專欄推薦: C語言初階系列 、 C語言進(jìn)階系列 、 數(shù)據(jù)結(jié)構(gòu)與算法 本章我們

    2023年04月11日
    瀏覽(22)
  • c++類和對象(拷貝構(gòu)造、運算符重載、初始化列表、靜態(tài)成員、友元等)

    c++類和對象(拷貝構(gòu)造、運算符重載、初始化列表、靜態(tài)成員、友元等)

    拷貝構(gòu)造函數(shù)的特征: 1、拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個重載形式; 2、拷貝構(gòu)造函數(shù)的參數(shù)只有一個且必須是同類類型對象的引用, 使用傳值方式編譯器直接報錯 ,因為會引發(fā)無窮遞歸調(diào)用。 在c++中自定義類型 傳值傳參 的時候要調(diào)用拷貝構(gòu)造函數(shù)。 3、若未顯式定義,

    2024年02月15日
    瀏覽(27)
  • 【C++基礎(chǔ)】類與對象(下) 初始化列表、友元、內(nèi)部類、匿名對象

    【C++基礎(chǔ)】類與對象(下) 初始化列表、友元、內(nèi)部類、匿名對象

    ???內(nèi)容專欄: C/C++編程 ??本文概括: C++基礎(chǔ)語法。初始化列表、 explicit 、 static 成員、友元、內(nèi)部類、匿名對象、拷貝對象時的一些編譯器優(yōu)化等。 ??本文作者: 阿四啊 ??發(fā)布時間:2023.9.8 在創(chuàng)建對象時,編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個成員變量一個

    2024年02月09日
    瀏覽(57)
  • 17. C++ static、const 和 static const 類型成員變量聲明以及初始化

    1. C++ static、const 和 static const 類型成員變量聲明以及初始化 const 定義的常量在超出其作用域之后其空間會被釋放; static 定義的靜態(tài)常量在函數(shù)執(zhí)行后不會釋放其存儲空間; 1.2 static static 表示的是靜態(tài)的 類的靜態(tài)成員函數(shù)、靜態(tài)成員變量是和類相關(guān)的,而不是和類的具體對

    2024年01月18日
    瀏覽(53)
  • 【C++基礎(chǔ)(六)】類和對象(下)--初始化列表,友元,匿名對象

    【C++基礎(chǔ)(六)】類和對象(下)--初始化列表,友元,匿名對象

    ??博主CSDN主頁:杭電碼農(nóng)-NEO?? ? ?專欄分類:C++初階之路? ? ??代碼倉庫:NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 關(guān)于類和對象的大致內(nèi)容已經(jīng)結(jié)束 本篇文章主要是介紹一些冗雜的細(xì)節(jié) 雖然本節(jié)的內(nèi)容屬于對類和對象錦上添花 但在很多特定的場所下,還是

    2024年02月14日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包