c ++ const成员函数

Ton*_*ion 2 c++ const function member

我正在阅读一本名为"Effective C++,Second Edition"的书,以及它关于const成员函数以及你如何具有逐位常量和概念常数的讨论.

它说大多数编译器都会使用按位常量,这是因为你无法改变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;
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,它在我的书中说它应该允许你改变它的值s,即使它const.这是因为char*数据指向的const char*值与指向的值相同. *data在这种情况下不是const.

但是,尝试在MS VC++ 6.0中运行它,它会在行引发访问冲突 *nasty = 'M';

有人可以解释发生了什么吗?我想我错过了什么?

对我来说,似乎因为我们有一个const mystring s,我们不应该改变它,但是它在书中所说的内容似乎很尴尬.

小智 7

访问冲突是因为您尝试更改字符串文字.您的代码相当于:

char * p = "Hello";
* p = 'M';
Run Code Online (Sandbox Code Playgroud)

这在C和C++中都是非法的 - 与const成员函数无关.