我想知道声明一个函数const
是否有任何好处。
我知道这意味着该方法不能修改任何非静态类成员,但这样做的唯一目的是防止有人将该函数重新实现为修改的东西非静态成员,还是有性能差异?如果存在性能差异,编译器通常可能比人类做得更好,例如使用inline
函数吗?
为了澄清,我问的是以下成员函数之间的区别:
float getWidth() const
{
return width;
}
float getWidth()
{
return width;
}
答案 0 :(得分:7)
我知道这意味着该函数无法修改任何非静态类成员
不,const并不意味着。这意味着必须允许您在常量对象上调用该函数,这是一件很重要的事情。即使您实际上没有修改非const成员函数中的任何非静态数据成员,也不允许在常量对象上调用它。
struct A
{
void f()
{
}
};
void g(const A& a)
{
a.f(); // error
}
从技术上讲,const意味着此属于const ClassName*
而不是Classname*
。其余规则是该定义的直接后果。
我不认为潜在的性能差异在这里非常重要。
答案 1 :(得分:3)
将变量声明为const
允许编译器执行许多优化。它可能被视为strict aliasing rule的强化。如果两个指针的类型相同,通常编译器必须假定它们可以是别名。但是如果声明或使用const
,编译器可能会忽略与这些操作相关的潜在别名。这可以减少不必要的负载和溢出,从而实现更简单,更快速的代码。
使代码const
- 正确也很重要,这样它才能与其他代码正确互操作。根据具体情况,抛弃const
限定符可能会调用未定义的行为,因此如果函数不是const
,则通常不可能在const
对象上使用该函数。这会给碰巧拥有const
个对象的任何人带来问题。
答案 2 :(得分:2)
函数声明形成函数(方法)和调用者之间的绑定契约。
这非常重要,因为它允许编译器强制执行逻辑上正确的程序(如果程序员试图破坏合同,它将无法编译)。
这是声明函数及其参数列表时的主要和唯一考虑因素。
合同看起来像这样:struct A {
// func promises not to alter the internal state of *this
void A::func() const;
// func reserves the right to modify the internal state of *this
void A::func();
};
// func asserts that it reserves the right to modify a
void func(A& a);
// func asserts that it absolutely won't (actually can't) modify a
void func(const A& a);
// func asserts that it will take a copy of a, which it can modify,
// store or destroy as it sees fit
void func(A a);
请记住,编译器会强制执行这些契约(将const A传递给正在检测A& A的函数将无法编译)。
这与强制执行无关,与性能无关。