按位常量和指针:
Posted
技术标签:
【中文标题】按位常量和指针:【英文标题】:Bitiwise Const and pointers: 【发布时间】:2015-02-05 17:11:51 【问题描述】:我在 Meyers 中读到了一行: “经常修改指针指向的成员函数不会作为 const。 但如果对象中只有指针,函数是按位常量,编译器不会抱怨。”
我不明白修改函数中的指针不能保持其按位不变,因为它是一个成员变量...
即使我们假设按位常数仅适用于指针指向的值,而不适用于指针地址本身。 那为什么它是类中唯一的成员变量或者它不是唯一的唯一成员变量..
【问题讨论】:
那是因为函数没有修改指针。它修改指向的对象。 我想你是反过来理解的。 后面的例子我觉得很清楚,你需要解释一下为什么后面的例子没有说明问题,没有足够的上下文来正确回答这个问题。解释这本书出自哪本书以及哪件物品也会很有帮助。 再仔细读一遍那句话。你所描述的不是你所引用的。 谢谢大家。我现在明白了答案..将来通过发布问题会更清楚.. 【参考方案1】:基本上这意味着如果你有
struct Foo
int bar;
;
您不能让 const 成员函数更改 bar
的值。
但是,如果 bar
是一个指向 int
的指针,您可以在 const 方法中更改 int 的值,因为 int
实际上并不是结构的一部分。
两个版本都实现了相同的目标(即更改 int
的值),但在第一个版本中,您破坏了按位常量,编译器会抱怨,而在第二个版本中则不会。
【讨论】:
我宁愿质疑你的最后一段。也许用“语义上的”换成“功能上的”? @LightnessRacesinOrbit 更好?【参考方案2】:它是按位的const
,因为只有成员函数
修改 [the] 指针指向的内容
所以对象实例数据(成员指针)不会只改变它指向的堆上的对象。
【讨论】:
【参考方案3】:参加以下简单的课程:
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;
;
【讨论】:
【参考方案4】:如果我没看错的话,如果成员函数修改了存储在当前对象中的指针所指向的值,那么它通常不是限定 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
此处未修改。
【讨论】:
以上是关于按位常量和指针:的主要内容,如果未能解决你的问题,请参考以下文章