c 類和物件(下篇)

2021-09-09 07:56:32 字數 4229 閱讀 9640

再談建構函式

c++11 的成員初始化新玩法。

static成員

友元內部類

初始化列表:以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,每個"成員變數"後面跟乙個放在括

號中的初始值或表示式。

每個成員變數在初始化列表中只能出現一次(初始化只能初始化一次)

類中包含以下成員,必須放在初始化列表位置進行初始化:

引用成員變數

const成員變數

類型別成員(該類沒有預設建構函式

class  b

private:

int _b;};

class a

private:

const

int n;

int& dday;

b d;};

intmain()

假設將下列**的_size和_array的順序交換,擇初始化_array陣列時開闢空間的大小則會成為隨機值

注意:成員變數在類中宣告次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先後次序無關

class array

private:

int _size;

int* _array;};

intmain()

匿名物件:(匿名物件的生命週期只有那一行)

1.匿名物件應用

if(n >10)

_aa =

date

(100);

2.date

(2019,3

,6).

display()

;

注意:此關鍵字實際上就是為了阻止進行隱式型別轉換,在一般的場景下不經常使用

我們來看下面的乙個奇特的行為:

date a1(10

);date a2 = a1;

//拷貝構造

date a3 =11;

//隱式型別轉換1.構造了乙個匿名物件 2.拷貝構造給a3 3.優化

const date a4 =

11;

加上後則無法通過編譯:防止型別轉換

explicit date

(int year =

2018

,int month =1,

int day =1)

:n(10

)

多引數的c++11支援這種情況

date a3 =

非靜態成員變數,可以在成員宣告時,直接初始化

class b

int _b;};

class a

private:

// 非靜態成員變數,可以在成員宣告時,直接初始化。

int a =10;

b b =20;

int* p =

(int*)

malloc(4

);static

int n;};

int a:

:n =10;

intmain()

宣告為static的類成員稱為類的靜態成員,用static修飾的成員變數,稱之為靜態成員變數;用static修飾的

成員函式,稱之為靜態成員函式。靜態的成員變數一定要在類外進行初始化

面試題:編寫乙個函式判斷一共建立了多少個類的物件

class aa(

const a& d)

static

intget()

//不加static則會建立乙個物件呼叫函式,加上之後則可以得到準確的結果

private:

static

int rcount;};

int a:

:rcount =0;

intmain()

靜態成員為所有類物件所共享,不屬於某個具體的例項(成員共享)

靜態成員變數必須在類外定義,定義時不新增static關鍵字(定義不加關鍵字)

類靜態成員即可用類名::靜態成員或者物件.靜態成員來訪問(::訪問)

靜態成員函式沒有隱藏的this指標,不能訪問任何非靜態成員(沒有this指標不可訪問非靜態成員)

靜態成員和類的普通成員一樣,也有public、protected、private3種訪問級別,也可以具有返回值,

const修飾符等引數(和類普通成員相同)

面試題:求1+2+3+…+n

class solution };

intsum_solution

(int n)

private:

static

int i;

static

int sum;};

int solution:

:i =1;

int solution:

:sum =

0;

友元分為:友元函式和友元類

友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多

用。友元函式可以直接訪問類的私有成員,它是定義在類外部的普通函式,不屬於任何類,但需要在類的內部聲

明,宣告時需要加friend關鍵字。

若直接過載《或者》將不能使用正常順序書寫。

class date

void

display()

private:

int _year;

int _month;

int _day;};

ostream& operator<<

(ostream& _cout,

const date& d)

istream& operator>>

(istream& _in, date& d)

intmain()

說明:

友元函式可訪問類的私有成員,但不是類的成員函式(不是類成員)

友元函式不能用const修飾(const只能用來修飾this指標)

友元函式可以在類定義的任何地方宣告,不受類訪問限定符限制(隨機定義)

乙個函式可以是多個類的友元函式(多指向性)

友元函式的呼叫與普通函式的呼叫和原理相同(呼叫原理相同)

友元類的所有成員函式都可以是另乙個類的友元函式,都可以訪問另乙個類中的非公有成員。

友元關係是單向的,不具有交換性。

比如上述time類和date類,在time類中宣告date類為其友元類,那麼可以在date類中直接訪問time

類的私有成員變數,但想在time類中訪問date類中私有的成員變數則不行。

友元關係不能傳遞

如果b是a的友元,c是b的友元,則不能說明c時a的友元。

class date;

// 前置宣告

class time

private:

int _hour;

int _minute;

int _second;};

class date

void

settimeofdate

(int hour,

int minute,

int second)

private:

int _year;

int _month;

int _day;

time _t;

};

內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的物件引數來訪問外部類中

的所有成員。但是外部類不是內部類的友元。

class a};

};int a:

:k =1;

intmain()

a的大小計算與b的大小無關,上面的**大小為4(靜態成員變數不計算大小)

內部類可以定義在外部類的public、protected、private都是可以的。

注意內部類可以直接訪問外部類中的static、列舉成員,不需要外部類的物件/類名。

sizeof(外部類)=外部類,和內部類沒有任何關係。

C 學習筆記 類和物件(下篇)

include using namespace std 初始化列表 class b private int a 4 char b 1 class a class d private int g void display private int year 4 int month 4 int day 4...

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...

C 物件和類

1,特殊的類 字串string include include using namespace std int main 類似於標準庫函式,我們不需要記住每種 類 的全部操作,只需要在使用過程中記住一些常用的操作就可以了。如果有需要的話,可以求助於相關書籍或網路 2,當我們對string進行種種操作...