开发者社区> 问答> 正文

c++如果我有一个成员变量仅在某个成员函数foo()调用的时候赋值,就不能声明foo()成const?

class A{
    list<int> _li; //我不希望在构造函数的时候进行赋值
public:
    A(){};
    void getLi(){  //这个函数如果不声明成const就不能被const变量调用,但由于修改成员变量不能被声明成const
        for (int i = 0; i < 10; i++) _li.push_back(i);
    }

};
void main(){
    const A a;
    a.getLi(); //编译报错
}

我应该怎么处理这种仅在调用某函数时赋值的情况?

我也想过用mutable,但我觉得mutable只适用于不描述对象属性的变量,用在这里是一种滥用,有没有别的解决方式?

展开
收起
a123456678 2016-03-09 15:10:36 2766 0
1 条回答
写回答
取消 提交回答
  • 如果你所说的“赋值”是指初始化的话(赋初值),一个类的数据成员是不可能不被初始化的。如果这个数据成员没有在构造函数的初始化列表里进行初始化,那么编译器会对其进行默认初始化(default initialize)。所以不可能仅在某个成员函数内才初始化该类的数据成员。

    如果你所说的“赋值”不是指初始化,而是指改变现有值,那么可以通过在数据成员声明中添加mutable来做到。

    但是,使用mutable的时候要注意:

    在改变声明中包含mutable的数据成员的时,不应该影响这个类的外在状态。
    换句话说:

    声明中包含mutable的数据成员应该用于描述类内部的状态,这些数据成员的改动不会从逻辑上改变这个类的状态。
    比如用于程序调试的成员、用于缓存(或者说被延迟赋值)的成员、用于访问检测的成员、用于互斥锁的成员等可以使用mutable,因为这些成员的改变并没有在逻辑上改变相应类的状态。

    2019-07-17 18:56:12
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载