gpt4 book ai didi

c++ - 惰性属性 - 可变的有效使用?

转载 作者:行者123 更新时间:2023-11-30 04:05:27 24 4
gpt4 key购买 nike

今天我发现自己写了一些如下代码,我想知道这是否是对 mutable 关键字的有效使用。

我的想法是,我想通过一个const 指针访问一些属性,但我只想在需要时评估这些属性。

class Person {
public:
Person() : age(-1) {}
~Person() {}

int GetAge() const {
if( age == -1 ) { CalculateAge(); }
return age;
}

private:
mutable int age;

// Note: as a result of being called from a `const` method,
// CalculateAge has to be const itself.
void CalculateAge() const {
age = 33; // do calculation based on date of birth or whatever.
}
};

这就是 mutable 的意义所在,还是我在这里滥用了它?我用上面的代码在概念上等同于

的推理说服自己
class Person {
public:
Person() {}
~Person() {}

int GetAge() const {
// Always do the expensive calculation here
return 33;
}
};

class Person {
public:
Person() {
// Do the expensive calculation here even if age is never used.
age = 33;
}
~Person() {}

int GetAge() const {
return age;
}

private:
int age; // non-mutable
};

其中 GetAge() 被正确标记为 const;它是否实际缓存结果是一个实现细节,与我类的客户端无关。

编辑:此外,我有兴趣听听任何其他不涉及将所有内容设为非const的解决方案。

最佳答案

如果你想让一个方法是const,可以使用mutable,因为它不会改变对象的外部状态,但你仍然需要改变一些内部状态。在我看来,这正是你在这里所拥有的。年龄的延迟计算只是一些内部优化,向用户隐藏该优化是合理的。用户将不明白为什么获取年龄会修改对象(的外部状态)。

但是:我不喜欢可变的。如果你有一个驻留在只读内存中的常量对象(例如只读文件映射),则可变可能是一个问题。如果您随后对该对象调用 const 方法,编译器将不会报错。但是,如果您修改某些可变对象,代码将崩溃。

关于c++ - 惰性属性 - 可变的有效使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23287454/

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