我遇到的情况与我目前对C ++方法的理解相冲突。
我正在通过Ivor Horton的“Beginning Visual C ++ 2010”(Wrox出版社)。在页449,示例8_03,方法定义为:
double Volume() const {
return m_Length * m_Width * m_Height;
}
我已将修饰符重新排列为:
double **const** Volume() {
return m_Length * m_Width * m_Height;
}
从我的C#和Java背景来看,我曾期望const的位置无关紧要,但在编译时我收到了错误:
error C2662: 'CBox::Volume' : cannot convert 'this' pointer from
'const CBox' to 'CBox &'
当我将订单退回Ivor的方式时,错误消失。
订单实际上是否有所作为,这不是一些奇特的错误?如果订单确实重要,那么如何记住正确的位置?
谢谢,
斯科特
答案 0 :(得分:9)
当const
放在成员方法的名称之后时,表明this
指针是常量。也就是说,原始声明声明方法CBox::Volume()
不会更改调用它的CBox
对象。
最可能的错误来源是在CBox::Volume()
或const CBox
的另一个const
方法内调用CBox
函数。
答案 1 :(得分:2)
在这种情况下,成员函数名后面的const
表示函数本身是const
- 基本上,这意味着你不能修改成员函数中的对象。成员函数之前的const表示返回类型为const
。 (虽然返回类型可能会很复杂,但我不想进入这里:))
答案 2 :(得分:2)
已编辑更简洁。
const
在这两种情况下非常不同。
double Volume() const {
return m_Length * m_Width * m_Height;
}
当对象的实例化为const
并返回double
时,将调用此方法。如果您尝试使用非const实例调用该方法,则无法编译。
const myClass obj;
double d = obj.volume();
myClass obj2;
double d = obj2.volume(); // This Fails to compile
另一方面......
double const Volume() {
return m_Length * m_Width * m_Height;
}
当对象不是const
或者先前的定义不存在时,将调用。
myClass obj;
const double d = obj.volume();
const myClass obj2;
const double d = obj2.volume();
(我应该提一下,因为我在下面提醒过,返回一个const内置类型,例如double
,这并不意味着什么。)
当你声明了这两个时,将根据实例是否为const来调用相应的一个。
myClass obj;
const double d = obj.volume(); // This calls `const double volume()`
const myClass obj2;
double d = obj2.volume(); // This calls 'double volume() const`
答案 3 :(得分:2)
方法名称后的const
告诉编译器该方法不会修改任何数据成员(mutable
成员是例外)。
方法名称前的const
适用于返回值。这告诉编译器该方法返回常量数据。返回类型的const
主要用于引用和指针。
答案 4 :(得分:1)
是的,订单很重要。
在C ++中,const关键字的位置会对项目为“const”产生影响。 const关键字的使用范围也是如此。