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 但是結果卻是奇葩的,這個是因為建構函式的初始化列表遵循的原則是先初始化父類 父類也是這個原則,那麼就相當於遞迴 然後初始化本類的成員,最後執行建構函式的函式體 而初始化本類的...