我是否应该声明任何可以为const的方法为const方法?
Should I declare any method that can be const a const method
简单的问题。Should I declare any method that can be const a const method?
这包括不返回任何成员变量或返回对成员变量的const引用的方法。有什么理由不这样做(除了明显的原因,编译器无论如何都会指出)?
非const
方法不能通过指向常量对象的指针调用。因此,如果方法可以为const
,不声明它为const将人为限制其使用。
除此之外,使方法const
是一个重要的语义细节,它可以给用户一种调用它所期望的效果的感觉。
看来我要成为不和谐的音符了:
我应该将任何可以是const的方法声明为const方法吗?
不,应该在设计的时候在不同的层次上做决定。您应该将所有在语义上不修改对象的方法标记为const
。这可能包括一些方法,这些方法实际上修改了一些内部细节,这些细节不是对象可感知状态的一部分(这些属性应该是mutable
),它可能不包括一些根本不改变任何东西的方法。
enum impl { // different implementations of the algorithm
one_implementation,
another_implementation
};
class example {
mutable std::pair<bool, int> cache;
protected:
int a, b;
public:
example( int a, int b ) : cache(), a(a), b(b) {}
virtual ~example() {}
void set( int _a, int _b ) {
cache.first = false; // invalidate previous result
a = _a;
b= _b;
}
int expensive_calculation() const {
if ( !cache.first ) {
cache.second = calculate();
cache.first = true;
}
return cache.second;
}
virtual void change_impl( impl x ) {}
private:
virtual int calculate() const = 0;
};
在当前的形式中,您不能更改实现,并且change_impl
是非const的,即使它不修改任何成员属性,它也不会标记为const
,因为在语义上它会更改。
另一方面,expensive_calculation()
方法在语义上不修改对象的状态,在调用操作之前和之后的可感知状态将是相同的,但它确实修改了cache
属性以加快以后的调用(如果状态没有改变)。因此,方法是const
,缓存是mutable
。
是。根据Effective c++,"尽可能使用const"
如果一个方法不修改对象的逻辑状态,那么您应该将该方法标记为const。对于对象的客户端来说,这是一个很好的服务,因为在给定const引用/指针的情况下,它们可以被充分利用。
有一种情况,我会考虑使用const:一个基类虚函数。继承的类不能被其重写的函数更改,这可能是一件好事,但一些开发人员可能不同意,因此确实不得不跳过一些障碍。
- 从 const 对象访问非 const 方法
- 为什么我可以调用一个从const方法更改成员的方法
- 使用新的c++返回值语法的Const方法
- const_cast const 方法中的"this"将"this"分配给外部变量?
- const 方法使用引用修改对象
- 从具有相同基数的另一个派生类调用派生类的非 const 方法
- 返回非常量引用编译的 Const 方法
- C++:无法从 const 方法返回对象的shared_ptr
- 是否可以从 const 方法迭代链表
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- 在使用指向 const 和非 const 方法的成员指针时减少模板专用化的数量
- "可变"变量只能由 const 方法之一可变?
- Golang中的const方法
- C++ 逻辑恒常性和 const方法的按值返回
- c++将标志添加到const方法中
- C++防止const方法通过成员指针或引用更改数据
- 为什么 const 方法不覆盖 C++ 中的非 const 方法?
- 如何在const方法中迭代映射
- 为什么没有标准化的方法来避免const方法的代码重复
- 修改 const 方法中的 pointee 值