C++ const面試題和相關的解釋
問題:如果函式需要傳入一個指標,面試官可能會問是否需要為該指標加上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);
相關文章
- [C++] STL相關面試題C++面試題
- 例子解析C++的引用,傳參,const的相關特點C++
- ES相關面試題面試題
- 集合相關面試題面試題
- 面試遇到的redis相關問題面試Redis
- 隨機概率相關的面試題隨機面試題
- c++ -- &和 * 的解釋C++
- C++中的 const 關鍵字C++
- TCP相關面試題總結TCP面試題
- Vue的一些相關面試題Vue面試題
- oracle相關術語的解釋Oracle
- 面試題(五)常見vue相關面試題總結面試題Vue
- 關於C++ const 的全面總結C++
- c/c++ const關鍵字C++
- 一道與 for 相關的字串面試題字串面試題
- Java中JVM相關面試題-整理JavaJVM面試題
- Unity3D相關面試題Unity3D面試題
- 系統設計 相關面試題面試題
- 【Java面試題】之泛型相關Java面試題泛型
- 面試中網路相關題目面試
- 面試題及相關參考答案面試題
- 【Java面試題】如何回答GC相關問題Java面試題GC
- 關於C/C++ const變數 const指標 以及C++ 引用變數的解析C++變數指標
- C++關鍵字(static/register/atuo/extern/volatile/const)釋疑 (轉)C++
- 翻譯 | SpringBoot相關的面試問題Spring Boot面試
- iOS 記憶體管理相關面試題iOS記憶體面試題
- SSM框架相關基礎面試題整理SSM框架面試題
- 前端面試之js相關問題前端面試JS
- 分享10道Docker容器相關面試題!!!Docker面試題
- C/C++中Static和Const的作用C++
- 【C++】“反轉連結串列”相關的題目C++
- RocketMq(三)相關名詞解釋MQ
- 解決ROS國內rosdep init和update的相關問題ROS
- 深入淺出 Runtime(六):相關面試題面試題
- Hadoop/Spark相關面試問題總結HadoopSpark面試
- iOS RunLoop 總結以及相關面試題解答iOSOOP面試題
- springboot+springcloud相關面試題Spring BootGCCloud面試題
- HTTPS總結+相關面試問題解答HTTP面試