我在迈耶斯读了一句话: “修改指针经常指向的成员函数不会动作为const。 但是如果只有指针在对象中,则函数是按位const,编译器不会抱怨。“
我无法理解修改函数中的指针不能保持其按位常量,因为它是一个成员变量......
即使我们假设按位常量仅适用于指针指向的值而不是指针地址本身的值。 那么,为什么它是类中唯一的成员变量或者它不是唯一的唯一成员变量呢?
答案 0 :(得分:4)
基本上这意味着如果你有
struct Foo
{
int bar;
};
您无法使用const成员函数更改bar
的值。
但是如果bar
是指向int
的指针,则可以在const方法中更改int的值,因为int
实际上不是结构的一部分。
两个版本实现了相同的目标(即更改int
的值),但在第一个版本中,您正在破坏按位常量,编译器会抱怨,在第二个版本中它不会。
答案 1 :(得分:2)
它按位const
因为成员函数只是
修改[指针]指向
的内容
所以对象实例数据(成员指针)不会只改变它所指向的堆上的对象。
答案 2 :(得分: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;
};
答案 3 :(得分: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
。