2015-02-05 94 views
3

我在Meyers中讀取一行: 「成員函數修改指針指向的指針常常不起作用const。 但是,如果只有指針位於對象中,則該函數是按位const ,編譯器也不會抱怨。「Bitiwise Const和指針:

我不明白,在一個功能修改指針不能保持其按位constantness因爲它的成員變量...

即使我們假設按位constantness僅適用於指針指向而不是值指針地址本身.. 那麼它爲什麼重要,如果其在類或如果不是唯一的唯一成員變量的唯一成員變量..

+2

這是因爲該函數不修改指針。它修改指向的對象。 – 2015-02-05 17:19:33

+2

我想你可以用另一種方式來理解它。 – cerkiewny 2015-02-05 17:19:37

+0

我想後面的例子很清楚,你需要解釋爲什麼後面的例子沒有闡明問題,沒有足夠的上下文來正確回答這個問題。這也將有助於解釋這是哪本書來自哪個項目。 – 2015-02-05 17:20:15

回答

4

基本上這意味着,如果你有

struct Foo 
{ 
    int bar; 
}; 

你不能有一個const成員函數改變bar的值。

但是,如果bar是指向int的指針,則可以更改const方法中int的值,因爲int實際上並不是結構的一部分。

這兩個版本都達到了相同的目標(即更改int的值),但在第一個版本中,您打破了按位常數,編譯器會在第二個版本中投訴,而第二個版本不會。

+0

發佈問題時會更清楚我相當反駁你的最後一段。也許「功能上」交換「語義上」? – 2015-02-05 17:32:41

+0

@LightnessRacesinOrbit更好? – Borgleader 2015-02-05 17:34:39

+0

不錯 – 2015-02-05 18:34:31

2

這是按位const因爲成員函數只

修改什麼[中]指針指向

所以對象instace數據(成員指針)不會改變只對對象它指向的堆。

1

看看下面的簡單類:

class A 
{ 
    public: 
     A(int d = 0) : data(d) {} 
     void func() const 
     { 
      ++data; // Can't do this. That's changing 
        // the bitwise content of this. 
     } 


    private: 
     int data; 
}; 

而且

class B 
{ 
    public: 
     A(int d = 0) : data(new int(d)) {} 
     void func() const 
     { 
      ++(*data); // Can do this. That doesn't change 
        // the bitwise content of this. 
     } 


    private: 
     int* data; 
}; 
0

如果我正確地讀它,成員函數通常是沒有資格const如果在修改由指針的值指出存儲在當前對象中:

class A { 
    char* string; 
public: 
    void UpCaseString() { strupr(string); } 
    .... 
} 

UpCaseString()方法修改屬於該對象的數據,因此通常不會將其聲明爲const。但是它實際上會修改某些緩衝區分配當前對象,A類的實例有且只有一個char*指針到緩衝區,因此緩衝區仍然可以修改,即使對象本身是const

class A { 
    char* string; 
public: 
    void UpCaseString() const { strupr(string); } 
    .... 
} 

void foo(A const &a) { 
    a.UpCaseString(); 
} 

此處未修改會員a.string