C++ const面試題和相關的解釋

便便飛翔發表於2017-08-15

問題:如果函式需要傳入一個指標,面試官可能會問是否需要為該指標加上const,把const加在指標不同位置有什麼區別;如果寫的函式需要傳入的引數是一個複雜型別的例項,面試官可能會問傳入值引數或者引用引數有什麼區別,什麼時候需要為傳入的引用引數加上const?

(1)const是用來宣告一個常量的,當你不想讓一個值改變時就用const。

當const修飾指標時:

     int b=100;

     const int*a=&b;    [1]

     int const *a=&b;   [2]

     int* const a=&b;   [3 ]

     const  int* const  a=&b;  [4]

如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;因此,[1]和[2]的情況相同,都是指標所指向的內容為常量(const放在變數宣告符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a=3;

如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量,[3]為指標本身是常量,而指標所指向的內容不是常量,。這種情況下不能對指標本身更改操作,如a++是錯誤的;

[4]為指標本身和指向的內容均為常量。

(2)用const修飾函式的輸入引數。

      第一,對於非內部資料型別的輸入引數,應該將“值傳遞”的方式改為“const引用,目的提高效率”。例如將void Func(A a)改為voidFun(const A&a)。第二,對於內部資料型別的輸入引數,不要將“值傳遞”的方式改為“const引用傳遞”。否則既達不到高效率的目的,有降低了函式的可理解性。例如void Func(int x)不應該改為void Func(const int&x)。

(3)const修飾函式的返回值。

    第一,如果給以“指標傳遞”方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const修飾的同型別指標。例如函式

    const char*GetString(void);

 如下語句將出現編譯錯誤:

char*str=GetString();

正確的用法是:

const char*str=GetString();

第二,如果函式返回值採用“值傳遞方式”,由於函式會把返回值複製到外部臨時的儲存單元中,加const修飾沒有任何價值。

第三,函式返回值採用“引用傳遞”的場合並不多,這種方式一般只出現在類的賦值函式中,目的是為了實現鏈式表達。例如:

class A

{

A&operate=(const  A&other);//賦值函式

};

A a,b,c;//a,b,c為A的物件

.....

a=b=c;//正常的鏈式賦值

(a=b)=c;//不正常的鏈式賦值,但合法

如果將賦值函式的返回值加const修飾,那麼該返回值的內容不允許被改動。上例中,語句a=b=c仍然正確,但是語句(a=b)=c則是非法的。

3、const修飾成員函式

任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其他非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。一下程式中,類stack的成員函式GetCount僅用於計數,從邏輯上講GetCount應當為const函式。編譯器將指出GetCount函式中的錯誤。

class Stack

{

public:

void Push(int elem);

int Pop(void);

int GetCount(void)const;//const成員函式,const只能放在函式的尾部

private:

int m_num;

int m_data[100];

};

int Stack::GetCount(void)count

{

++m_num;

Pop();

return m_num;

}

const 成員函式的宣告看起來怪怪的:const關鍵字只能放在函式宣告的尾部,大概是因為其它地方都已經被佔用了。

char greeting[]="Hello";

char *p=greeting;//non-const pointer,non-const data

const char*p=greeting;//non-const pointer,const data

char*const p=greeting;//const pointer,non-const data

const char*const p=greeting;//const pointer,const data

1.解釋下面ptr含義和不同

double*ptr=&value;//ptr是一個指向double型別的指標,ptr的值可以改變,ptr所指向的value的值也可以改變

const double*ptr=&value//ptr是一個指向const double型別的指標,ptr的值可以改變,ptr所指向的value的值不可以改變

double*const ptr=&value//ptr是一個指向double型別的指標,ptr的值不可以改變,ptr所指向的value的值可以改變

const double*const ptr=&value//ptr是一個指向const double型別的指標,ptr的值不可以改變,ptr所指向的value也不可以改變

2.去掉const屬性,例:const double value=0.0f;double*ptr=NULL;怎麼才能讓ptr指向value?

強制型別轉換,去掉const屬性,如ptr=《const_cast double*>(&value);

相關文章