据我所知,const应尽可能使用.但是,我有一个总是困扰我的案例.
我是否应该将成员函数标记为const不更改任何成员变量值但它在概念上不是const函数?
例如:
class Engine{
public:
int status;
};
class Car{
public:
void start() const{
engine_->status = 1;
}
private:
std::unique_ptr<Engine> engine_;
};
Run Code Online (Sandbox Code Playgroud)
编译器将接受const的const,start()因为engine_指针没有改变.然而,至少IMO似乎是不切实际的,在一个被称为start类的函数中调用的函数Car是const一个!
这个例子只是一个快速的例子.通常,Car应该更新类的某些内部状态,使const关键字不可行.然而,迷你的例子只是为了说明我的想法.
Nic*_*las 14
函数是否应该是一个简单的度量标准const:
Type a{...};
Type b{...};
bool comp1 = a == b;
b.some_func(...);
bool comp2 = a == b;
Run Code Online (Sandbox Code Playgroud)
如果comp1和comp2能永远是不同的,那么some_func是不是const.
显然,并不是每种类型都有operator==过载,但大多数都至少有一个概念性的想法,即你要测试它们是否相等.Car具有不同engine状态的不同实例将是不相等的.因此,改变engine状态的功能不是const.
在你的情况下,编译器允许你start()通过指针不完美地传播const 来制作const.如果用类型对象替换指针,Engine问题就会消失.所以答案是否定的,不应该const在这种情况下使用Engine智能指针或实例是内部细节,不应该影响类的公共接口Car.
至于我在这里和那里阅读,应尽可能使用const.
这种说法过于笼统,并且与任何通用建议一样,不应在每种情况下正式使用.