Bitiwise Const and pointers:

Bitiwise Const and pointers:

本文关键字:pointers and Const Bitiwise      更新时间:2023-10-16

我在Meyers中读到一行:修改指针经常指向的内容的成员函数不起常量作用。但是,如果只有指针在对象中,则函数是位常量,编译器不会抱怨。"

我不明白修改函数中的指针不能保持其位常量,因为它是成员变量。。。

即使我们假设逐位常量仅适用于指针指向的值,而不适用于指针地址本身。。那么,如果它是类中唯一的成员变量,或者它不是唯一的成员变数,这又有什么关系呢。。

基本上,这意味着如果你有

struct Foo
{
    int bar;
};

不能让const成员函数更改bar的值。

但是,如果bar是指向int的指针,则可以在const方法中更改int的值,因为int实际上不是结构的一部分。

两个版本都实现了相同的目标(即更改int的值),但在第一个版本中,您破坏了逐位常量,编译器会抱怨,而在第二个版本中则不会。

它是按位const,因为成员函数只有

修改指针指向的内容

因此对象实例化数据(成员指针)不会只更改它所指向的堆上的对象。

采用以下简单类:

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