是方法返回类型和修饰符在C+中的顺序+;重要吗? 我遇到了一个与我目前对C++方法的理解冲突的情况。 我正在通过Ivor Horton的“开始Visual C++ 2010”(WROX出版社)工作。在第449页示例8_03中,方法定义为: double Volume() const { return m_Length * m_Width * m_Height; }
我已将修饰符重新排列为:是方法返回类型和修饰符在C+中的顺序+;重要吗? 我遇到了一个与我目前对C++方法的理解冲突的情况。 我正在通过Ivor Horton的“开始Visual C++ 2010”(WROX出版社)工作。在第449页示例8_03中,方法定义为: double Volume() const { return m_Length * m_Width * m_Height; },c++,visual-c++,C++,Visual C++,我已将修饰符重新排列为: 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的方
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的方式返回订单时,错误消失了
这个顺序真的有区别吗?这不是什么奇异的错误吗?如果顺序确实重要,那么人们如何记住正确的位置呢
谢谢
Scott当
const
放在成员方法的名称之后时,即说明此
指针是常量。也就是说,原始声明声明方法CBox::Volume()
不会更改调用它的CBox
对象
最有可能的错误源是对
const CBox
调用CBox::Volume()
函数,或者在该CBox
的另一个const
方法中调用CBox::Volume()
在这种情况下,成员函数名后的const
表示函数本身是const
,基本上,这意味着您不能在成员函数中修改对象。成员函数前面的常量表示返回类型为const
。(虽然退货类型可能会变得复杂,我不想在这里讨论:)是的,顺序很重要
在C++中,const关键字的位置会影响到什么项目是“const”。const关键字的使用范围也是如此。编辑后的范围更简洁
const
在这两种情况下是非常不同的
double Volume() const {
return m_Length * m_Width * m_Height;
}
当对象的实例化为const
并返回double
时,将调用此函数。如果您尝试用非常量实例调用该方法,它将不会编译
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;
}
当对象不是常量时或如果前面的定义不存在时调用
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`
方法名称后的常量告诉编译器该方法不会修改任何数据成员(mutable
成员是例外)
方法名称应用于返回值之前的常量
。这告诉编译器该方法返回常量数据。返回类型的const
主要用于引用和指针 你的最后一个片段可能有点误导。返回值可以存储在非常量double
中,然后进行更改。是 啊你知道吗,事后我就想到了。内置式就不那么干瘪了。我将进行编辑以反映这一点。这给人一种有点错误的印象,obj
必须是常量才能调用第一个,而在第二种情况下,结果必须分配给常量double。(第二种情况实际上应该是毫无意义的——G++甚至警告在返回类型上忽略顶级常量限定符。)我应该更简洁,这应该更好。啊,是的!这正是它-编译器对此和常量感到不安。因此,将常量附加到方法末尾的事实只是一个标准规则…末尾的常量意味着这是常量?我猜Java/C的松散的goosey世界太宽容了:)@Scott:Java不太宽容,但它没有类型限定符。使用const
时,重要的是要修改复杂类型的哪一部分int-const*
与int-const
不同,因为const适用于不同的事物。类似地,const
在成员函数声明中的位置也是有意义的。请注意,“成员函数”——如果你一直调用它们,你会不自觉地把C++看作是java的一个不同的帽子,而不是: