我正在阅读一本名为“Effective C++, Second Edition”的书,其中讨论了 const 成员函数以及如何拥有按位 const 和概念 const 。
它说大多数编译器将使用按位 const-ness,即您不能在 const 成员函数内更改对象的数据成员。
然后有一个成员函数的例子,它在 const 测试中似乎没有按位运行。
它是这样的:
#include "stdafx.h"
#include <string>
#include <iostream.h>
using namespace std;
class mystring
{
public:
mystring(const char* value);
operator char *() const { return data; }
private:
char * data;
};
mystring::mystring(const char * value)
{
mystring::data = const_cast<char*>(value);
}
int main(int argc, char* argv[])
{
const mystring s = "Hello";
char * nasty = s;
*nasty = 'M';
printf("s: %c", s);
return 0;
}
当它运行时,它在我的书中说它应该允许你改变 的值s
,即使它的const
. 这是因为 char* 数据指向的值与指向的值相同const char*
。 *data
在这种情况下不是const
。
但是尝试在 MS VC++ 6.0 中运行它,它会在行引发访问冲突 *nasty = 'M';
有人可以解释发生了什么吗?我想我错过了什么?
在我看来,因为我们有一个 const mystring s
,我们不应该能够改变它,但是它在书中所说的似乎很尴尬。