程序員筆試知識點總結之C++

2.預處理、const、sizeof

2.1宏定義

#define SUB(x,y) x-y
#define ACCESS(element,offset,value) *SUB(&element,offset) =value
ACCESS(array[5],4,6);
將會被轉化爲:*&array[5]-4 = 6;
減號運算符的優先級大於賦值運算符,先處理減法,返回一個數不能進行賦值操作,因此,會產生編譯錯誤。
宏定義不能以分號結尾,預處理器會計算常數表達式的值。

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必須與函數定義體放在一起才能成爲內聯函數,和函數聲明放在一起沒用



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