【发布时间】:2010-07-02 11:43:58
【问题描述】:
我正在阅读一本名为“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,所以我们应该无法更改它,但是书中所说的似乎很尴尬。
【问题讨论】:
-
这与问题无关,但请记住,本书的那个版本和 Visual Studio 6 都可以追溯到语言标准化之前的日子,当时很多常见的还没有想到 C++ 习语。如果您想了解当今如何使用 C++,最好使用第三版(我强烈推荐)和现代编译器。如果您想继续使用 Microsoft,可以免费下载 Visual Studio Express。
标签: c++ function constants member