2015-04-05 29 views
0
#include <iostream> 
using namespace std; 

class Object 
{ 
public: 
    Object() {} 

    void Print() const 
    { 
     cout << "const" << endl; 
    } 

    void Print() 
    { 
     cout << "mutable" << endl; 
    } 
}; 

void print_obj(const Object& obj) 
{ 
    obj.Print(); 
} 

int main() 
{ 
    Object  obj1; 
    const Object obj2; 
    Object*const pobj1 = &obj1; 

    print_obj(obj1); 
    print_obj(obj2); 

    obj1.Print(); 
    obj2.Print(); 

    pobj1->Print(); 

    return 0; 
} 

調用函數我知道輸出是帶或不帶「常量」,在C++簽名

const 
const 
mutable 
const 
mutable 

我想爲const對象,它看起來對const函數。否則,可變函數。但爲什麼最後一個是可變的?

+0

'pobj1'是一個指向非const的Object的const指針。指針本身不能被修改(不能被指向別的東西),但它指向的對象可以被修改,所以調用一個非const的重載。請注意'Object * const'與'Object const *'不是同一個類型 – 2015-04-05 02:13:29

回答

2

但爲什麼最後一個可變?

Object*const pobj1 = &obj1; 

聲明pobj1是一個const指針到非const對象。該對象仍然是可變的,但指針不是。

變量初始化後,您將無法將其更改爲指向另一個變量。

pobj1 = &obj2; // Not OK. 

但你仍然可以改變它指向的變量,並通過指針調用非類const成員函數。

*pobj1 = obj2; // OK 
1

但爲什麼是最後一個可變的?

這是因爲聲明爲Object* const pobj1。由於我們正在使用指針,因此有2個const可能性。

const Object* const pobj1 OR Object const * const pobj1 
^^1^^   ^^2^^     ^^1^^ ^^2^^ 
// 1 applies to the types (i.e., Object) 
// 2, which is what you're using applies to the pointer, therefore you're using a non-const Object 
-1

我相信你的意思是「const Object *」。 「const」可以應用於指針和/或指針指向的對象。扭曲的是「Object * const」與「Object const *」相同。

+0

'Object const *'和'const Object *'是一樣的' – 2015-04-05 03:35:52

0

Object*const pobj1 = &obj1; 

聲明pobj1是一個常量指針到一個非const對象。如果你懷疑, 只是將其更改爲

Object*const pobj2 = &obj2; 

這不能編譯,因爲它扔掉OBJ2的const修飾。

順便說一句,限制是對於const對象,它只能使用const函數。括號之後的'const'意味着'this *'指針將被視爲指向方法內的const對象的指針。

對於非常量對象,它可以同時使用常量和非常量方法,但它會首先選擇使用非常量(如果兩者都已定義)。