gpt4 book ai didi

c++ - 为什么下标运算符 C++ 经常成对出现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:45 24 4
gpt4 key购买 nike

C++ FAQ正在定义模板容器 Matrix 以避免棘手的 new delete 代码。教程说下标运算符经常成对出现?为什么会这样?

T&       operator() (unsigned i, unsigned j); 
T const& operator() (unsigned i, unsigned j) const;

为什么会这样?

这也称为:常量重载。

常见问题提供线索。您还有其他意见吗?

特别是,mutate() 是否应该遵守某些规则以仅在 const 对象上安全使用?

最佳答案

简单来说,因为作业有两个方面:左侧和右侧。

非常量版本:T& operator() (unsigned i, unsigned j); 主要用于赋值的左侧(即用作赋值的目标).

常量版本:T const& operator() (unsigned i, unsigned j) const; 专门用于赋值的右侧。

请注意这里的措辞差异:const 版本只能用在赋值的右边,而非 const 版本可以用在赋值的右边任何一边。但是,如果您有一个 const 限定的对象,您只能调用 const 限定的成员函数,因此在这种情况下根本不能使用它。这正是您(至少通常)想要的——它可以防止修改您说过不应该修改的对象(通过 const 限定)。

mutate 而言,它通常仅用于在它们的逻辑 状态和它们的按位 状态之间有一些差异的对象.一个常见的例子是一个懒惰地做一些(通常是昂贵的)计算的类。为避免重新计算该值,它会在计算后保存该值:

class numbers { 
std::vector<double> values;
mutable double expensive_value;
bool valid;
public:
numbers() : valid(false) {}

double expensive_computation() const {
if (valid) return expensive_value;
// compute expensive_value here, and set `valid` to true
}
};

因此,expensive_computation 的结果完全取决于 values 中的值。如果您不关心速度,您可以在每次用户调用 expensive_computation 时重新计算该值。在 const 对象上重复调用它总是会产生相同的结果——所以调用一次后,我们假设它可能会被再次调用,并且为了避免重复进行相同的昂贵计算,我们只是将值保存到 expensive_value。然后,如果用户再次请求它,我们只返回该值。

换句话说,从逻辑的角度来看,即使我们修改expensive_value,对象仍然是const。对象的可见状态不会改变。我们所做的只是让它更快地执行 const 操作。

为了使其正常工作,我们还希望在用户修改 values 的内容时将 valid 设置回 false。例如:

void numbers::add_value(double new_val) {
values.push_back(new_val);
valid = false;
}

在某些情况下,我们可能还需要中间级别的有效性——我们可能能够通过(例如)准确知道哪些数字已添加到 expensive_value 来更快地重新计算 code>values,而不仅仅是一个 bool 值来说明它当前是否有效。

我应该补充一点,C++11 添加了一些关于 constmutable 的新要求。长话短说,在大多数情况下,您需要确保任何 const 和/或 mutable 也是线程安全的。你可能想看 Herb Sutter's video对此。不过,我确实觉得有必要补充一点,我认为他关于 mutable 的结论可能有点被夸大了(但我宁愿你自己观察并决定而不是相信我的话)。

关于c++ - 为什么下标运算符 C++ 经常成对出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15435738/

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