我在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