Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是方法返回类型和修饰符在C+中的顺序+;重要吗? 我遇到了一个与我目前对C++方法的理解冲突的情况。 我正在通过Ivor Horton的“开始Visual C++ 2010”(WROX出版社)工作。在第449页示例8_03中,方法定义为: double Volume() const { return m_Length * m_Width * m_Height; }_C++_Visual C++ - Fatal编程技术网

是方法返回类型和修饰符在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的一个不同的帽子,而不是: