0

考虑以下示例:

#include <iostream>

using std::endl;
using std::cout;

class my_class {
private:
    int _expensive_count_operation() const {
        return 10;
    }
    bool cached;
    int last_count;
public:
    my_class() { cached = false; }
    int get_count() {
        if (cached) {
            cout << "Got count from cache." << endl;
            return last_count;
        }
        cout << "Computing count." << endl;
        last_count = _expensive_count_operation();
        cached = true;
        return last_count;
    }

    int get_const_count() const {
        my_class* _this = const_cast<my_class*>(this);

        if (cached) {
            cout << "Got count from cache." << endl;
            return last_count;
        }
        cout << "Computing count." << endl;
        _this->last_count = _expensive_count_operation();
        _this->cached = true;
        return last_count;
    }
};

int main() {
    my_class my_object1,my_object2;
    int count;
    count = my_object1.get_count();
    cout << "Count: " << count << endl;
    count = my_object1.get_count();
    cout << "Count: " << count << endl;

    count = my_object2.get_const_count();
    cout << "Count: " << count << endl;
    count = my_object2.get_const_count();
    cout << "Count: " << count << endl;

}

在 get_const_count 方法中使用 const_cast 允许您保留方法 const。现在的问题是与此相关的危险是什么?与失去使用此类的 const 实例(或指向它们的指针)的能力相关的危险相比,它们如何?而且,更好的是,有没有更好的方法?

我经常发现自己处于这种情况,我编写了代码,然后我想使用缓存进行优化。问题是我必须删除 const 声明并将该更改传播到代码库的其余部分。

4

2 回答 2

4

我更愿意将所有与缓存相关的属性标记为mutable. 的含义const应该是可观察状态不受这些方法的影响(这是您的缓存无论如何都应该做的)。请记住,所有 const 方法也应该是线程安全的。

有关更多信息,我推荐Herb Sutter的博客- 他从 c++11 开始写了一些关于 const-correctness 的内容。这里也是Herb 相关视频的直接链接。

于 2013-08-01T23:40:52.650 回答
2

仅当原始对象不是时才有效用于const_cast删除。如果总是这样,那么这样做应该没有问题。constconst

虽然我更喜欢设置last_count和...因为您真的不想意外修改对象的任何其他部分 - 但您确实想修改成员函数中的那些cached部分。mutableconst

于 2013-08-01T23:40:26.213 回答