C ++中方法返回类型和修饰符的顺序是否重要?

时间:2011-03-10 21:38:18

标签: c++ visual-c++

我遇到的情况与我目前对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的方式时,错误消失。

订单实际上是否有所作为,这不是一些奇特的错误?如果订单确实重要,那么如何记住正确的位置?

谢谢,

斯科特

5 个答案:

答案 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关键字的使用范围也是如此。

相关问题