【高質量C++/C總結5】const常用用法-提高程式的健壯性
說在開始:
我提煉了《C++ Primer》、《侯捷C++》、《高質量程式設計指南——C/C++語言》等資料中的重要部分,並總結成此博文。其中涉及到許多我個人對C++的理解,如若有不合理之處,還請朋友們多多指出,我會虛心接受每一個建議。同時,我將實現程式碼放到了我的GitHub上https://github.com/ModestBean/C-Samples,可供下載參考。
內容介紹
本篇部落格需要對C++的指標傳遞、引用傳遞、值傳遞,字串,字元陣列有一些認識。
const除了const常量的用法以外,其還有其他三方面的作用(1)保護函式入口引數(2)保護函式返回值(3)保護類資料成員不被修改。
使用const修飾函式引數
指標傳遞:
共三種用法,注意觀察const的位置。
void pointer_print(const char* src);//const在char*之前,無法修改指標指向的記憶體單元內容
void pointer_print(char* const src);//const在char*之後,無法修改指標的指向
void pointer_print(const char* const src);////前後都有,兩者綜合
值傳遞:
實參傳遞時,函式自動拷貝一份實參放在堆疊,為形參。在函式內改變值改變的都是形參,不會對實參產生影響,一般認為不需要使用const。當然程式中需要避免值的修改也可以使用const。
引用傳遞:
值傳遞時如果傳遞的為物件,會設計到物件的建構函式,拷貝等等一系列複雜的操作,因此傳遞引用,同時為了防止引用改變,新增const。
//以下兩種方式都是相同的。
void object_reference(const Object& in) {
Object b;
//in = b; 錯誤
}
void object_reference(Object const& in) {
Object b;
//in = b; 錯誤
}
基本資料型別就不用使用&了,因為不涉及構造,析構等。
const修飾函式返回值
指標傳遞
const char* getCharPointer (char* in) { return in; } int main() { char c[] = "Hello"; const char* newc = getCharPointer(c); cout << newc << endl; std::cin.get(); }
必須在變數newc前面加上const才可以編譯通過。
值傳遞
一般情況下,編譯器會把返回值放到臨時的儲存單元中,通常加const沒有實際意義。
引用傳遞
const Object& getObjectReference(Object& ob)
{
return ob;
}
如若沒有加const,那麼以下此種方式是正常執行的,當新增const後,提示錯誤,因為返回值是不允許重新賦值的。
Object a;
Object b = getObjectReference(a) = a;
其現實程式設計中很少見返回值使用引用傳遞,因為往往會涉及到一個容易忽視的問題。例如:
Object& returnObject()
{
Object ob;
return ob;
}
這段程式碼得到的將會垃圾值,因為在函式returnObject執行完以後,ob物件在棧中,編譯器自動銷燬,想必引用也是不存在的。
保護類資料成員不被修改
觀察以下程式碼的getSquare方法,在其內部是無法修改width和height的,提高了程式的健壯性。
//Const_Function_Return.cpp
class Rect
{
public:
Rect(int inWidth, int inHeight) :width(inWidth), height(inHeight) {};
int getSquare() const
{
//width = 2; 無法編譯,試圖修改成員變數
return width * height;
}
private:
int width, height;
};
int main()
{
Rect r(3, 4);
int square = r.getSquare();
cout << square << endl;
cin.get();
return 0;
}