2015-02-05 92 views
3

我在Meyers中读取一行: “成员函数修改指针指向的指针常常不起作用const。 但是,如果只有指针位于对象中,则该函数是按位const ,编译器也不会抱怨。“Bitiwise Const和指针:

我不明白,在一个功能修改指针不能保持其按位constantness因为它的成员变量...

即使我们假设按位constantness仅适用于指针指向而不是值指针地址本身.. 那么它为什么重要,如果其在类或如果不是唯一的唯一成员变量的唯一成员变量..

+2

这是因为该函数不修改指针。它修改指向的对象。 – 2015-02-05 17:19:33

+2

我想你可以用另一种方式来理解它。 – cerkiewny 2015-02-05 17:19:37

+0

我想后面的例子很清楚,你需要解释为什么后面的例子没有阐明问题,没有足够的上下文来正确回答这个问题。这也将有助于解释这是哪本书来自哪个项目。 – 2015-02-05 17:20:15

回答

4

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

struct Foo 
{ 
    int bar; 
}; 

你不能有一个const成员函数改变bar的值。

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

这两个版本都达到了相同的目标(即更改int的值),但在第一个版本中,您打破了按位常数,编译器会在第二个版本中投诉,而第二个版本不会。

+0

发布问题时会更清楚我相当反驳你的最后一段。也许“功能上”交换“语义上”? – 2015-02-05 17:32:41

+0

@LightnessRacesinOrbit更好? – Borgleader 2015-02-05 17:34:39

+0

不错 – 2015-02-05 18:34:31

2

这是按位const因为成员函数只

修改什么[中]指针指向

所以对象instace数据(成员指针)不会改变只对对象它指向的堆。

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; 
}; 
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