Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 什么';这是怎么回事';const Obj';和';Obj&';?_C++_Operator Overloading_Constants - Fatal编程技术网

C++ 什么';这是怎么回事';const Obj';和';Obj&';?

C++ 什么';这是怎么回事';const Obj';和';Obj&';?,c++,operator-overloading,constants,C++,Operator Overloading,Constants,我想写一个与std::set兼容的类,所以我重载了“小于”操作符,如下所示。它起作用了 bool Segment::SVertex::operator<(const SVertex &rhs) const { return id < rhs.id; } 这是一个编译时错误:无法将“This”指针从“const Segment::SVertex”转换为“Segment::SVertex&” (请注意,我的VS2008不是英语,我翻译了错误消息,因此上面的行不一定准确)

我想写一个与std::set兼容的类,所以我重载了“小于”操作符,如下所示。它起作用了

bool Segment::SVertex::operator<(const SVertex &rhs) const
{
    return id < rhs.id;
}
这是一个编译时错误:无法将“This”指针从“const Segment::SVertex”转换为“Segment::SVertex&”

(请注意,我的VS2008不是英语,我翻译了错误消息,因此上面的行不一定准确)


我只知道“&”表示通过引用传递,而“const”禁止任何更改。我不太明白幕后发生了什么。

你的getter必须是常量:

long SVertex::getId() const {return id;}

这表明它不会更改对象。

问题是您的getter函数不是完全“正常”的;你的能手应该是

long SVertex::getId() const
{return id;}
请注意结尾的const:它告诉编译器/用户此方法不会修改类的内部结构。因此,可以在操作符<中使用它,这也是常量。
Const成员函数只能调用其他成员函数(如果它们也是Const);非常量成员函数可以调用任何。

您的
rhs
const
,因此不允许更改它。另一方面,您的
getId
不能保证不更改
-它还需要常量:

int SVertex::getId() const { return id; }

我明白了,所以在一个nut中,所有的函数都必须是const,这是由一个const函数调用的。您可以认为每个成员函数都有一个不可见的第一个参数
SVertex*this
。@unwind显示的语法是如何声明参数
const SVertex*this
。谢谢!这确实不正常哈哈!我应该改变我认为由编写数千行Java代码形成的方式。是我的错。
int SVertex::getId() const { return id; }