建構函式與初始化列表2

2021-10-25 19:46:36 字數 3539 閱讀 9350

0.初始化與賦值的區別

意義上:

1)初始化:乙個變數或者乙個物件在產生的時候就賦予乙個值,屬於伴隨性質

2)賦值:在乙個變數或者乙個物件在產生之後的任意時刻賦予乙個值,屬於任意性質

巨集觀**上:

1)兩者作用相同

2)對於陣列和結構體來說,初始化和賦值的的形式不同。對於陣列,可以使用花括號一起初始化,如果賦值的話,就只能單個元素就行;對於結構體,可以使用花括號初始化,否則只能通過「.」來訪問變數進行賦值

#include

#include

using namespace std;

struct mystruct

;int main()

;int b[3];

b[0] = 1;

b[1] = 2;

b[2] = 3;

mystruct stu1 = ;

mystruct stu2;

stu2.aa = 1;

stu2.bb = 3.14f;

stu2.cc = "we are csdn";

cout << stu1.aa << endl;

cout << stu1.bb << endl;

cout << stu1.cc << endl;

system("pause");

return 0;

}執行結果:

3)對於引用和const常量來說,只能初始化不能賦值

1.類中的變數初始化

1)一般情況下,宣告乙個類是並不佔記憶體的,如果直接在類中給變數初始化也是不允許的,但在vs2017下自己測試了一下,居然可以

#include

#include

using namespace std;

class cperson

;int main()

執行結果:

2.什麼是建構函式

建構函式也是乙個函式,這個函式有幾個特點:

1)函式的名字與類的名字相同

2)在建立乙個物件時,建構函式就自動執行,但是在宣告乙個類的指標物件時,建構函式不會被呼叫,當new乙個空間的時候,建構函式才會被呼叫

3)建構函式一般用來對資料成員的賦值,這也是它的一般性作用

4)建構函式沒有返回值

5)乙個類裡面也可以有多個建構函式,這些建構函式根據引數的不同,構成過載,根據引數的傳遞來選擇呼叫哪個建構函式

6)可以不用顯式的定義建構函式,這種情況下,編譯器會自動幫我們生成乙個空建構函式,什麼也不執行;如果我們顯式的宣告了乙個建構函式,那麼這個建構函式就會覆蓋預設的空建構函式

#include

#include

using namespace std;

class cperson

};int main()

執行結果:

3.建構函式的型別

雖然建構函式沒有返回值,但可以有引數,如果建構函式有引數,那麼在建立物件時,就一定要傳入引數,否則會報錯。同時,建構函式也可以指定形參預設值,在傳遞引數不夠時就使用預設值,這一點與基本的函式相同;也可以過載

#include

#include

using namespace std;

class cperson

};int main()

執行結果:

4.初始化列表

4.1作用:

對資料成員進行初始化

4.2格式:

建構函式():變數名1(數值),變數名2(數值)

{}      //!變數名不在花括號的後面,而是在花括號的前面

#include

#include

using namespace std;

class cperson

void show()

private:

int _a;

float _b;

string _c;

};int main()

執行結果:

4.3傳遞引數初始化列表

#include

#include

using namespace std;

class cperson

void show()

private:

int _a;

float _b;

string _c;

};int main()

執行結果:

注意:1)在建構函式執行時,先執行初始化列表,實現變數的初始化,然後再執行函式內部的語句

2)成員初始化的順序只與宣告的順序有關,而跟初始化列表的順序無關。例如在上面的初始化列表中,我們寫成:_c(cc), _b(bb), _a(aa),但是我們還是先初始化變數_a,然後_b,然後_c,因為我們先宣告的變數_a,然後_b,然後_c

3)成員之間可以相互初始化:a(12), b(a)  //a,b為相同型別的話

看乙個例子:

#include

#include

using namespace std;

class cperson

void show()

private:

int _a;

int _b;

};int main()

執行結果:

從這個結果就可以看出來,在初始化列表中,雖然我們把_b的初始化寫在前面的,但由於先宣告的變數_a,所以_a先被初始化,並且用_b的值去初始化_a,但此時_b並沒有被初始化,所以是乙個隨意值去初始化的_a,然後再用12初始化的_b,所以得到這樣的結果

5.引用和const常量的初始化

1)當類成員中有引用和const常量時就一定得初始化,否則會報錯

#include

#include

using namespace std;

class cperson

void show()

void show()

void show()

}private:

int a[4];

};int main()

執行結果:

7.結構體的初始化

格式1:建構函式():結構體名()

注意:結構體可以這樣用花括號進行初始化,但是陣列不可以

struct mystruct

;class cperson

)void show()

private:

mystruct _stu;

};格式2:建構函式(傳遞進來乙個結構體):結構體名(傳進來的結構體)

#include

#include

using namespace std;

struct mystruct

;class cperson

void show()

private:

mystruct _stu;

};int main()

;cperson op(stu0);

op.show();

system("pause");

return 0;

}執行結果:

建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval 是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exa...

建構函式初始化列表

c 程式語言中有很多比較重要的概念值得我們去深入 比如今天為大家介紹的有關c 建構函式的相關概念。這一方面的知識在實際程式設計中就是乙個比較重要的應用技術。希望能個大家可以從中學到一些知識。c 建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化...

建構函式初始化列表

class object private int v1,v2 看看願意是 先初始化v2為5,然後初始化v1為 3 倍的 v2 但是結果卻是奇葩的,這個是因為建構函式的初始化列表遵循的原則是先初始化父類 父類也是這個原則,那麼就相當於遞迴 然後初始化本類的成員,最後執行建構函式的函式體 而初始化本類的...