gpt4 book ai didi

c++ - c++ 中有没有一种方法可以确保类成员函数不会更改任何类数据成员?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:28 25 4
gpt4 key购买 nike

假设我有一个

class Dictionary
{
vector<string> words;
void addWord(string word)//adds to words
{
/...
}
bool contains(string word)//only reads from words
{
//...
}
}

有没有办法让编译器检查包含不变化的词 vector 。 Ofc 这只是一个类数据成员的示例,我希望它可以与任意数量的数据成员一起使用。附言我知道我没有 public: 和 private:,我故意把它去掉是为了让代码更短,问题更清楚。

最佳答案

如果您希望编译器强制执行此操作,则声明成员函数const:

bool contains(string word) const
{
...
}

const 函数不允许修改它的成员变量,只能调用其他const 成员函数(它自己的,或者它的成员变量的那些)。

此规则的异常(exception)情况是成员变量声明为mutable[但是 mutable 不应用作通用的 const 解决方法;它仅适用于对象的“可观察”状态应为 const,但内部实现(例如引用计数或惰性求值)仍需要更改的情况。]

另请注意,const 不会通过例如指针。

总结一下:

class Thingy
{
public:
void apple() const;
void banana();
};

class Blah
{
private:
Thingy t;
int *p;
mutable int a;

public:
Blah() { p = new int; *p = 5; }
~Blah() { delete p; }

void bar() const {}
void baz() {}

void foo() const
{
p = new int; // INVALID: p is const in this context
*p = 10; // VALID: *p isn't const

baz(); // INVALID: baz() is not declared const
bar(); // VALID: bar() is declared const

t.banana(); // INVALID: Thingy::banana() is not declared const
t.apple(); // VALID: Thingy::apple() is declared const

a = 42; // VALID: a is declared mutable
}
};

关于c++ - c++ 中有没有一种方法可以确保类成员函数不会更改任何类数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6213350/

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