1. 程式人生 > >【高質量C++/C總結5】const常用用法-提高程式的健壯性

【高質量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;
}