按位常量和指针:

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此处未修改。

【讨论】:

以上是关于按位常量和指针:的主要内容,如果未能解决你的问题,请参考以下文章

Masm 常量的按位运算

指针常量常量指针和指向常量的常量指针

指针和引用指针常量与常量指针

指针常量和常量指针

指针常量和常量指针

指针常量和常量指针的一些整理