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只适用于不描述对象属性的变量,用在这里是一种滥用,有没有别的解决方式?
如果你所说的“赋值”是指初始化的话(赋初值),一个类的数据成员是不可能不被初始化的。如果这个数据成员没有在构造函数的初始化列表里进行初始化,那么编译器会对其进行默认初始化(default initialize)。所以不可能仅在某个成员函数内才初始化该类的数据成员。
如果你所说的“赋值”不是指初始化,而是指改变现有值,那么可以通过在数据成员声明中添加mutable来做到。
但是,使用mutable的时候要注意:
在改变声明中包含mutable的数据成员的时,不应该影响这个类的外在状态。
换句话说:
声明中包含mutable的数据成员应该用于描述类内部的状态,这些数据成员的改动不会从逻辑上改变这个类的状态。
比如用于程序调试的成员、用于缓存(或者说被延迟赋值)的成员、用于访问检测的成员、用于互斥锁的成员等可以使用mutable,因为这些成员的改变并没有在逻辑上改变相应类的状态。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。