2.預處理、const、sizeof
2.1宏定義
2.2const
1)const在*前還是在*後的問題
const int * a = &b;
const在*之前,修飾指針所指向的變量,即指針指向的內容爲常量,不允許對內容進行直接修改
int b =100;
const int * a = &b;
*a = 600; //錯誤
a是一個倉庫管理員,他所進入的倉庫(*a)是他沒有權限動的,裏邊有什麼就是什麼。
如果要改變,可以通過改變b的值 b=200,或者將指針指向別處 int c = 200; a = &c;
const在*後邊,修飾指針本身是常量,不能將其指向其他地方,必須初始化
int b=500,c=300;
int * const a; //錯誤,沒有初始化
int * const a = &c; //正確
* a = 600;// 正確
a++; //錯誤,
a是一個倉庫管理員的話,他只能進入某一個指定的倉庫,不能進入其他的倉庫。
如果const前後都有*的話,表示指針和內容都是常量。
2)const成員函數
把不改變數據成員的函數後加上const關鍵詞標識,提高程序的可讀性和可靠性,如果一定要改變,則用mutable修飾成員變量,
如果const在成員函數聲明前邊,表示函數的返回值是一個常量。
3)和宏定義相比
const有數據類型,宏定義沒有,編譯器對const有進行類型安全檢查,對宏定義只是簡單的替換。
2.3sizeof
sizeof返回的是數據類型的大小,int float 4個字節,char 1個字節,指針類型4個字節,short 2個字節,double 8個字節 bool 1個字節
計算結構體的時候需要考慮對齊,是最長數據元素的整數倍,加通過pack預處理指令可以禁止對齊調整,但一般不這樣做,這樣會降低程序的性能,
class A
{
private:
bool a;
int b;
bool c;
}
A中 的元素所佔內存分別爲 2 4 2 ,依據最大元素長度補齊, sizeof(A)的大小爲12
class B
{
private:
int a;
bool b;
bool c;
}
B中的元素所佔內存分別爲 4 2 2,依據最大元素長度補齊,sizeof(B)的大小爲8
char* ss = "0123456789";
sizeof(ss)的結果爲4,指向字符串的字符指針,sizeof(*ss)的大小爲1,*ss是第一個字符。
char ss[] = "0123456789";
sizeof(ss)的大小爲11,ss是數組,計算到"\0",sizeof(*ss)的大小爲1,第一個字符。
char ss[100]="0123456789";
sizeof(ss)的大小爲100,strlen(ss)的大小爲10,strlen的的參數只能是chaar*型的,結尾必須是“\0”
數組做形參時傳遞的不是數組,是指針,這時候sizeof就退化爲指針的大小。
sizeof 括號內的內容是不被編譯的,直接被替換爲類型。
int a=8;sizeof(a=6); 執行結束後a的值還是8。
空類、多重繼承空類的大小都是1,虛繼承涉及虛指針,所以大小爲4。
2.4內聯函數
內斂函數要做參數類型檢查,一般使用情況如下:
(1)一個函數被反覆不斷的調用;
(2)函數只有簡單的幾行,且不包括,for,while,switch
內聯關鍵詞inline必須與函數定義體放在一起才能成爲內聯函數,和函數聲明放在一起沒用