C++基礎語法學習(3)

1.對象初始化列表:當成員變量是一個對象,且該對象沒有無參構造函數

1.必須這樣做:
如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的構造函數,沒有默認構造函數。這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的構造函數,
如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。
 
2、類成員中若有const修飾,必須在對象初始化的時候,給const int m 賦值
當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化,
因爲這兩種對象要在聲明後馬上初始化,而在構造函數中,做的是對他們的賦值,這樣是不被允許的。
2)C++中提供初始化列表對成員變量進行初始化
語法規則
Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
{
    // some other assignment operation
}
3)注意概念
初始化:被初始化的對象正在創建
賦值:被賦值的對象已經存在
 

2.構造函數調用順序與初始化列表無關,與對象的聲明順序有關,析構順序與其相反

 

3.匿名對象, Test(1,2) 其生命週期只有這一行代碼

 

4.new, delete(關鍵字)

new int;            //開闢一個存放整數的存儲空間,返回一個指向該存儲空間的地址(即指針)
new int(100);  //開闢一個存放整數的空間,並指定該整數的初值爲100,返回一個指向該存儲空間的地址
new char[10];  //開闢一個存放字符數組(包括10個元素)的空間,返回首元素的地址
new int[5][4];  //開闢一個存放二維整型數組(大小爲5*4)的空間,返回首元素的地址
float *p=new float (3.14159);  //開闢一個存放單精度數的空間,並指定該實數的初值爲//3.14159,將返回的該空間的地址賦給指針變量p

堆上申請的空間 默認初值爲0,棧上的爲垃圾值

5.對象指針用malloc不會調用構造函數,用new分配時會調用構造函數,但不會調用析構函數,因爲在棧上,需要手動調用delete來釋放空間

6. 靜態成員變量:把一個類的成員說明爲 static 時,這個類無論有多少個對象被創建,這些對象共享這個 static 成員
 靜態成員局部於類,它不是對象成員,在類的外部進行初始化

int Test::m_c = 10; 必須在外部進行初始化

調用方式:Test::count   或 s.count

 

7.靜態成員函數:靜態成員函數數冠以關鍵字static
靜態成員函數提供不依賴於類數據結構的共同操作,它沒有this指針
在類外調用靜態成員函數用 “類名 :: ”作限定詞,或通過對象調用
疑難問題:靜態成員函數中,不能使用普通變量,只能使用靜態成員變量

static只在聲明函數時寫

只可訪問靜態成員變量,不能訪問普通變量

 

8.類的大小爲成員變量所佔空間(棧或堆)

成員變量:
普通成員變量:存儲於對象中,與struct變量有相同的內存佈局和字節對齊方式
靜態成員變量:存儲於全局數據區中
成員函數:存儲於代碼段中。

所以對象共享成員函數

成員變量:
普通成員變量:存儲於對象中,與struct變量有相同的內存佈局和字節對齊方式
靜態成員變量:存儲於全局數據區中
成員函數:存儲於代碼段中。

不同對象雖然訪問同一個函數,但是根據this指針的不同,其傳入的地址參數也不同,所以同一個函數會調用不同的成員變量

 

9.const修飾的函數不能修改變量, void print()  const

const void print() 與void const print()相同,返回值readonly

函數定義時,末尾也要加const

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章