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。這個後面會介紹。