1. 程式人生 > >C++學習--const物件

C++學習--const物件

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++是強型別的語言,型別不同是不允許訪問的