1. 局部變量初始化
const int SIZE = 5;
int funcStatic() {
static int a1;
static int a2(0); //初始化
static int a3 = 0; //初始化
static int a4(0);
a4 = 0;
cout <<"a1: "<<a1++<<" a2: "<<a2++<<" a3: "<<a3++<<" a4: "<<a4++<<endl;
return 0;
}
int func(){
int b_1(1),b_2 = 2;
char c[] = {'C','+','+'}; // 不含'\0'
char c_1[] = {'C','+','+','\0'};
char c_2[] = "C++"; // 默認(rèn)追加'\0'
int d_1[SIZE]={1,2},d_2[]={1,2};
cout <<"b_1: "<<b_1<<" b_2: "<<b_2<<endl;
cout <<"sizeof(c) "<<sizeof(c)<<"\nsizeof(c_1) " \
<<sizeof(c_1)<<"\nsieof(c_2) "<<sizeof(c_2)<<endl;
cout <<"sieof(d_1) "<<sizeof(d_1) \
<<"\nsieof(d_2) "<<sizeof(d_2)<<endl;
cout <<"d_1[2] "<<d_1[2]<<endl;
return 0;
}
int main() {
func();
funcStatic();
funcStatic();
return 0;
}
/*
b_1: 1 b_2: 2
sizeof(c) 3
sizeof(c_1) 4
sieof(c_2) 4
sizeof(d) 20
sieof(d_1) 20
sieof(d_2) 8
d_1[2] 0
a1: 0 a2: 0 a3: 0 a4: 0
a1: 1 a2: 1 a3: 1 a4: 0
*/
1.1 靜態(tài)變量
- 在固定的地址上進(jìn)行存儲(chǔ)分配扶平,在靜態(tài)數(shù)據(jù)區(qū)(static data area炉旷,又 數(shù)據(jù)段(data segment) )
- 具有局部可見(jiàn)性付秕,內(nèi)部鏈接
- 在第一次調(diào)用時(shí)初始化辙喂,且僅初始化一次庸娱,作用域外其值保持不變
- 內(nèi)部類(lèi)型靜態(tài)變量链峭,如果未初始化畦娄,則編譯器默認(rèn)初始化為0
1.2 常量
- c++中const默認(rèn)為內(nèi)部鏈接;c默認(rèn)外部連接
- 初始化必須在定義點(diǎn)進(jìn)行
const int a = 1;
const int d[]={1,2,3,4};
extern const int size = 5; //明確為外部連接
1.3 引用
- 引用被定義時(shí)必須初始化
- 引用不可變更
- 沒(méi)有NULL引用
2. 類(lèi)成員變量
class Test{
static constexpr int x[3]={1,2,3};
static int s;
const int a[3] = {1,2,3};
const int b = 1;
const int c;
const int d[2];
public:
Test():c(4), d({5,6}) {//warning
cout <<a[0]<<" "<<b<<" "<<c<<" "<<d[0]<<endl;
}
};
int Test::s = 1;
int main() {
Test tl;
return 0;
}
//test.cpp: In constructor ‘Test::Test()’:warning: list-initializer for non-class type must not be parenthesized [enabled by default]
//output
//1 1 4 5
2.1 靜態(tài)成員
- 在類(lèi)內(nèi)定義,類(lèi)外初始化
2.2 常量成員
- 初始化是在類(lèi)的構(gòu)造函數(shù)的初始化列表里熙卡;
- 構(gòu)造函數(shù)函數(shù)體里常量成員已經(jīng)初始化完畢杖刷,不可初始化;
- 特殊的常量數(shù)組成員初始化
2.3 靜態(tài)常量成員
- 在定義的位置初始化
- 特別的靜態(tài)常量數(shù)組成員需要constexpr關(guān)鍵字而非const
constexpr是C++11中新增的關(guān)鍵字驳癌,其語(yǔ)義是“常量表達(dá)式”滑燃,也就是在編譯期可求值的表達(dá)式。最基礎(chǔ)的常量表達(dá)式就是字面值或全局變量/函數(shù)的地址或sizeof等關(guān)鍵字返回的結(jié)果颓鲜,而其它常量表達(dá)式都是由基礎(chǔ)表達(dá)式通過(guò)各種確定的運(yùn)算得到的表窘。
3. 類(lèi)對(duì)象初始化
class Test{
int a;
public:
Test():a(0){
cout <<"default"<<endl;
}
Test(const int &s):a(s){
cout <<"construct from int"<<endl;
}
Test(const Test &t):a(t.a){
cout <<"copy construction"<<endl;
}
Test& operator=(const Test &t){
a = t.a;
cout <<"operator="<<endl;
return *this;
}
};
int main() {
Test t1; //default
Test t2(2); //construct from int
Test t3(t2); //copy construction
Test t4 = t2; //copy construction
Test t5 = 5; //construct from int
t4 = t5; //operator=
Test t6[2]; //default default
Test t7[2] = {1,2};//construct from int construct from int
return 0;
}
- 類(lèi)對(duì)象的成員利用構(gòu)造函數(shù)列表初始化時(shí),是按定義順序初始化的
- 通過(guò)構(gòu)造函數(shù)初始化.但是對(duì)所有類(lèi)對(duì)象甜滨,類(lèi)的靜態(tài)變量只初始化一次乐严,且數(shù)據(jù)只有一份.
- 類(lèi)定義構(gòu)造函數(shù)時(shí)必須定義默認(rèn)構(gòu)造函數(shù),否則編譯出錯(cuò)衣摩;默認(rèn)構(gòu)造函數(shù)昂验,在聲明 類(lèi)的對(duì)象 數(shù)組或無(wú)參數(shù)類(lèi)對(duì)象時(shí)會(huì)被調(diào)用;
定義類(lèi)后編譯器默認(rèn)生成四個(gè)成員函數(shù):默認(rèn)構(gòu)造函數(shù)艾扮、析構(gòu)函數(shù)既琴、拷貝構(gòu)造函數(shù)、賦值函數(shù)
A(void); // 缺省的無(wú)參數(shù)構(gòu)造函數(shù)
A(const A &a); // 缺省的拷貝構(gòu)造函數(shù)
~A(void); // 缺省的析構(gòu)函數(shù)
A & operate =(const A &a); // 缺省的賦值函數(shù)