gpt4 book ai didi

C++ const 成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:47:58 27 4
gpt4 key购买 nike

我正在阅读一本名为“Effective C++,第二版”的书,其中讨论了 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;
}

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

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

谁能解释一下这是怎么回事?我想我错过了什么?

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

最佳答案

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

char * p = "Hello";
* p = 'M';

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

关于C++ const 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3165333/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com