当前位置:  开发笔记 > 编程语言 > 正文

const成员函数的语义是什么?

如何解决《const成员函数的语义是什么?》经验,为你挑选了1个好方法。

我知道该函数不允许更改对象的状态,但我想我在某处读过允许编译器假设如果使用相同的参数调用函数,它将返回相同的值,因此可以重用缓存值(如果可用).例如

class object
{
    int get_value(int n) const
    {
        ...
    }

...


object x;

int a = x.get_value(1);
    ...
int b = x.get_value(1);

然后编译器可以优化第二个调用,并使用寄存器中的值或只是执行 b = a;

这是真的?



1> Anthony Will..:

const是关于程序语义而不是实现细节.您应该const在不更改对象的可见状态时标记成员函数,并且应该在对象本身上可调用const.在类的const成员函数内X,类型thisX const *:指向常量X对象的指针.因此,所有成员变量实际上都const在该成员函数内(除了mutable那些).如果您有一个const对象,则只能const在其上调用成员函数.

您可以使用它mutable来指示成员变量甚至可以在const成员函数中更改.这通常用于标识用于缓存结果的变量,或用于不影响实际可观察​​状态的变量(如互斥锁(您仍需要在const成员函数中锁定互斥锁)或使用计数器).

class X
{
    int data;
    mutable boost::mutex m;
public:
    void set_data(int i)
    {
        boost::lock_guard lk(m);
        data=i;
    }
    int get_data() const // we want to be able to get the data on a const object
    {
        boost::lock_guard lk(m); // this requires m to be non-const
        return data;
    }
};

如果通过指针保持数据,而不是直接(包括智能指针如std::auto_ptrboost::shared_ptr),则指针变为const在一个const构件的功能,但不被指向的数据,因此可以修改所指向的数据.

至于缓存:通常编译器不能这样做,因为状态可能在调用之间改变(特别是在我的多线程示例中使用互斥锁).但是,如果定义是内联的,那么编译器可以将代码拉入调用函数并优化它在那里看到的内容.这可能导致该函数仅被有效地调用一次.

下一版本的C++标准(C++ 0x)将有一个新的关键字constexpr.标记的函数constexpr返回一个常量值,因此可以缓存结果.在这样的函数中你可以做什么是有限制的(为了编译器可以验证这个事实).

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有