gpt4 book ai didi

C++:常量上下文中指针数据成员的奇怪行为

转载 作者:太空狗 更新时间:2023-10-29 23:41:49 24 4
gpt4 key购买 nike

方法上的 const 限定符应该保护数据成员不被错误覆盖。如果你有一个指针数据成员,那么只有指针被保护,指向的值不是。它是 C++ 设计中的一个缺陷,还是它提供了一些基本的东西?

这是演示情况的代码。在报告不相关的错误和样式问题之前,请考虑其唯一目的是演示上述情况,并且简短明了。

#include <cstdio>
#include <cstdlib>
#include <cstring>

class Cat
{
public:
Cat(char const *name)
: _name(strdup(name))
{ }
~Cat(){ free(_name); }
void SetName(char const *name)
{
free(_name);
_name = strdup(name);
}
char const* GetName() const
{
_name[0] = 'P';
return _name;
}
private:
char *_name;
};

int main()
{
Cat c("lost+found");
c.SetName("Molly");
printf("%s\n",c.GetName());
return 0;
}

使用以下命令编译没有警告和错误:

g++ -W -Wall -Wextra -pedantic -Os pmc.cpp -o pmc

生成的程序的输出是 Polly

更新 使用迂腐的 char const * 而不是传统的 const char *

最佳答案

这里提供的基本内容就是清晰。指针是类的成员,它的指针不是:它既不会在类创建时自动销毁,也不会自动构造。它可能是一个完全不同的对象,因此当类变为 const 时它不一定是 const。

你在这里想要像 std::string 这样的东西,也就是说,指针的附加语义——例如保证它的内容不会在你的类之外改变。

关于C++:常量上下文中指针数据成员的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7783627/

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