C++ 什么';这是怎么回事';const Obj';和';Obj&';?
我想写一个与std::set兼容的类,所以我重载了“小于”操作符,如下所示。它起作用了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不是英语,我翻译了错误消息,因此上面的行不一定准确)
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; }