我在Meyers中讀取一行: 「成員函數修改指針指向的指針常常不起作用const。 但是,如果只有指針位於對象中,則該函數是按位const ,編譯器也不會抱怨。「Bitiwise Const和指針:
我不明白,在一個功能修改指針不能保持其按位constantness因爲它的成員變量...
即使我們假設按位constantness僅適用於指針指向而不是值指針地址本身.. 那麼它爲什麼重要,如果其在類或如果不是唯一的唯一成員變量的唯一成員變量..
我在Meyers中讀取一行: 「成員函數修改指針指向的指針常常不起作用const。 但是,如果只有指針位於對象中,則該函數是按位const ,編譯器也不會抱怨。「Bitiwise Const和指針:
我不明白,在一個功能修改指針不能保持其按位constantness因爲它的成員變量...
即使我們假設按位constantness僅適用於指針指向而不是值指針地址本身.. 那麼它爲什麼重要,如果其在類或如果不是唯一的唯一成員變量的唯一成員變量..
基本上這意味着,如果你有
struct Foo
{
int bar;
};
你不能有一個const成員函數改變bar
的值。
但是,如果bar
是指向int
的指針,則可以更改const方法中int的值,因爲int
實際上並不是結構的一部分。
這兩個版本都達到了相同的目標(即更改int
的值),但在第一個版本中,您打破了按位常數,編譯器會在第二個版本中投訴,而第二個版本不會。
發佈問題時會更清楚我相當反駁你的最後一段。也許「功能上」交換「語義上」? – 2015-02-05 17:32:41
@LightnessRacesinOrbit更好? – Borgleader 2015-02-05 17:34:39
不錯 – 2015-02-05 18:34:31
這是按位const
因爲成員函數只
修改什麼[中]指針指向
所以對象instace數據(成員指針)不會改變只對對象它指向的堆。
看看下面的簡單類:
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;
};
如果我正確地讀它,成員函數通常是沒有資格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
。
這是因爲該函數不修改指針。它修改指向的對象。 – 2015-02-05 17:19:33
我想你可以用另一種方式來理解它。 – cerkiewny 2015-02-05 17:19:37
我想後面的例子很清楚,你需要解釋爲什麼後面的例子沒有闡明問題,沒有足夠的上下文來正確回答這個問題。這也將有助於解釋這是哪本書來自哪個項目。 – 2015-02-05 17:20:15