【c++語法系列】【一】const詳解

1.普通const變量初始化c++

int a = 9;
	const int ca = a;  // 非const賦值給const
	int b = a;         // const賦值給非const,若是是對象,則調用對象的operator=運算符,進行拷貝賦值
                       // b 是a的副本,b的修改不會影響到a,因此能夠賦值

2.const引用變量函數

int a = 9;
	const int & ca = a;  // 非const變量賦值給const引用

	const int b = 9;
	const int &cb = b;   // const變量賦值給const引用

	int c = cb;          // const引用賦值給非const變量
	//int &cc = cb;      // error,const引用不能賦值給非const引用,一旦能夠賦值,則能夠經過cc修改cb的值,這就破壞了cb是const引用的定義

3.const變量作函數參數this

void f(int &a)
{
	cout << a << endl;
}

void fc(const int a)
{
	cout << "fc a=" << a << endl;
}

	int a = 9;
	const int & ca = a;  // 非const變量賦值給const引用

	fc(a);  // 非const值傳遞給const變量,實際上調用對象的拷貝構造函數A(A a);
	fc(ca); // const引用傳遞給const變量,兩者都不會修改ca的值
	//f(ca);  // 將const引用傳遞給非const引用參數,能夠經過參數a修改ca的值,因此違背了ca的const屬性,error

總結一:const常量與非const常量之間能夠隨意傳輸,可是const引用不行。只能非const引用傳給const引用,不能const引用傳遞給非const引用。指針

一句話原則:凡是能修改const變量值的作法,都是非法的。code

4.const成員函數對象

類的成員函數,若是不須要修改類的成員變量,通常設置爲const。接口

class A
{
public:
	A(int age) {
		this->age_ = age;
	};
	int  get()const {  // const用於修飾this,表示當前對象this的屬性值不會被修改
		return this->age_;
	}
	void set(const int &age) {  // const修飾入參,並非修飾this,因此this的屬性能夠被修改
		this->age_ = age;       // 調用對象的operator=方法,進行數據賦值。c++中,若是類沒有定義operator=方法,編譯器會默認合成一個。
	}
private:
	int age_;
};
int main(int argc, int * argv[])
{


	int a = 9;
	const int & ca = a;  // 非const變量賦值給const引用
	A tom(10);
	cout << tom.get() << endl;
	tom.set(ca);
	cout << "main" << endl;
	system("pause");
}

總結:const在工程中,通常有一下幾個用法資源

一、定義常量,用於替代宏定義。get

二、普通函數的參數中的常量引用。編譯器

三、成員函數的this指針設置爲const。

四、成員函數的入參的常量引用。

 

在c++中,有兩點須要注意

// A a;
	// A b;
	// a = b; 這裏實際調用A的operator=方法,進行數據拷貝,若是A沒有顯示定義該方法,則編譯器會自動合成一個operator=方法
// A a;
	/*
	void f(A a);
	f(a); 這裏的參數時值傳遞,會調用A的拷貝構造函數,進行數據拷貝。A(A a);若是A沒有顯示定義該構造函數,則編譯器會自動合成一個
	*/

因而可知,c++中對象的拷貝,其實是由這兩個函數默默完成的,即便沒有編寫這兩個接口。從某種意義上來說,這種默認的作法,就是爲了這種函數參數值傳遞與對象賦值。可是,若是對象的屬性存在指針,則會有問題,這會引出淺拷貝與深拷貝的概念;有些對象若是不想被拷貝,好比對象太大,拷貝太耗費資源,則能夠刪除這兩個方法,使用=delete。這個後面會介紹。

相關文章
相關標籤/搜索