個人主頁 : 個人主頁
個人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》《C++》
前言
本篇博客作為C++:初始化列表,static成員,友元,內(nèi)部類的知識總結(jié)。
一、初始化列表
初始化列表:以冒號開始,接著是一個以逗號分隔的數(shù)據(jù)成員列表,每個“成員變量”后面跟一個放在括號中的初始值或表達(dá)式。
- 初始化列表是每個成員變量定義的地方
- 每個成員變量在初始化列表中只能出現(xiàn)一次,也就是每個對象的成員變量只能定義一次
- 引用成員變量,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ù)賦初值和初始化列表初始化混用
- 盡量使用初始化列表,因為不管你是否使用初始化列表,對于自定義類型成員變量,一定會優(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;
}
這就是因為,成員變量初始化的順序與成員聲明的順序有關(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;
}
A類的大小為1,也就是空類。
- 靜態(tài)成員變量必須在類外定義,定義時不添加static關(guān)鍵詞,類中只是聲明
- 類靜態(tài)成員即可用 類名::靜態(tài)成員 或者 對象.靜態(tài)成員來訪問
- 靜態(tài)成員函數(shù)沒有隱藏的this指針,不能訪問任何非靜態(tài)成員
- 靜態(tài)成員也是類成員,受public,protected,private訪問限定符的限制
如果想訪問靜態(tài)成員 i,可以實現(xiàn)Geti()等函數(shù)來訪問
三、友元
友元分為友元函數(shù)和友元類
友元函數(shù)
例如我們要對日期類重載<<操作符時,會發(fā)現(xiàn)無法將operator<<重載為成員函數(shù),因為隱含的this指針占據(jù)了operator<<函數(shù)的第一個參數(shù)位置。這樣重載的<<操作符就無法正常使用。
當(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;
}
- 友元函數(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類的成員變量 -
友元關(guān)系不能傳遞
-
友元關(guān)系不能繼承
四、內(nèi)部類
內(nèi)部類:如果一個類定義在另一個類的內(nèi)部,這個類就叫左內(nèi)部類。內(nèi)部類是一個獨立的類,它不屬于外部類,更不能通過外部類的對象去訪問內(nèi)部類的成員。
如圖: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;
}
- sizeof(外部類) = 外部類,和內(nèi)部類沒有任何關(guān)系
class A
{
public:
class B
{
private:
int _b;
};
A()
:_a(0)
{}
private:
static int i;
int _a;
};
上述類的大小是?文章來源:http://www.zghlxwxcb.cn/news/detail-721965.html
總結(jié)
以上就是我對于初始化列表,static成員,友元,內(nèi)部類,匿名對象的知識總結(jié)。感謝支持?。?!文章來源地址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)!