C++學習--const物件
阿新 • • 發佈:2018-11-17
C++的const和C語言的差別非常大,在C++中const修飾的變數是真正意義上的常量,雖然能取地址,但不能修改;在C語言中,const是一個偽常量,修飾的變數可以通過指標修改。
1.在C++中const還可以修飾類的成員函式,代表著常函式,不能修改類的成員資料。
#include<iostream> class Person { private: int age; public: Person(int); void change(int)const;//修飾類的成員函式 }; Person::Person(int age) { this->age=age; } void Person::change(int age)const//定義時還需要帶上const修飾 { this->age=age; std::cout<<"age="<<age<<"\n"; } void main() { Person p1(20); p1.change(21);//嘗試呼叫change函式 std::cin.get(); }
在VS2013進行編譯後,報錯提示:正在通過常物件訪問age。
那麼如果非要通過const函式修改類的屬性呢?
C++提供了mutable這個關鍵詞,用它修飾的變數可以不受const約束。
mutable int age;
在int age前面加上mutable後,const函式可以修改屬性的值
2.如果用const例項化一個物件又會是什麼情況?
#include<iostream> class Person { private: mutable int age; public: Person(int); void change(int)const;//修飾類的成員函式 void print();//增加一個沒有const修飾的成員函式 }; Person::Person(int age) { this->age=age; } void Person::change(int age)const//定義時還需要帶上const修飾 { this->age=age; std::cout<<"age="<<age<<"\n"; } void Person::print() { std::cout<<"from print"<<"\n"; } void main() { const Person p1(20);//例項化時帶上const修飾 p1.change(21);//嘗試呼叫change函式 p1.print(); std::cin.get(); }
VS2013報錯提示:不能將“this”指標從“const Person”轉換為“Person &”。
也就是說用const例項化一個類後是常物件,而沒有被const修飾的成員函式常物件因為型別問題沒有辦法訪問,因為C++是強型別的語言和弱型別的C還是有很大區別。如果非得要呼叫只能通過型別強轉。
對程式碼做出下面的修改:
const Person p1(20);//例項化時帶上const修飾
p1.change(21);//嘗試呼叫change函式
Person *p = (Person *)&p1;//對p1進行型別強轉
p->print();
對型別強轉後成功訪問:
3.總結:
(1)const修飾的成員函式不能對類的成員資料做出修改,但mutable關鍵詞可以去掉const限制
(2)const修飾例項化後的物件時常物件,可以訪問帶有const修飾的成員函式,但不能訪問沒有帶const修飾的成員函式
(3)C++是強型別的語言,型別不同是不允許訪問的