"const Obj"和"Obj &"是怎么回事?

What's the matter with 'const Obj' and 'Obj &'?

本文关键字:Obj 怎么回事 const      更新时间:2023-10-16

我想写一个与std::set兼容的类,所以我像这样重载"小于"运算符。它有效。

bool Segment::SVertex::operator<(const SVertex &rhs) const
{
    return id < rhs.id;
}

然而,由于我写Java的次数比C++多,"rhs.id"看起来很不舒服。所以我把它改为"rhs.getId()",其中getId(()只是一个普通的getter函数:

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

这是一个编译时错误:无法将"This"指针从"const Segment::SVertex"转换为"Segment:;SVertex&"

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

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

问题是getter函数并不完全是"正常"的;你的吸气剂应该是

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

请注意结尾处的const:它告诉编译器/用户该方法不会修改类的内部。因此,可以在您的运算符<这也是常数。Const成员函数只能在其他成员函数也是Const的情况下调用它们;非常数成员函数可以调用任意函数。

您的getter必须是常量:

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

这表明它不会改变对象。

您的rhsconst,因此不允许更改它。另一方面,您的getId并不承诺不更改this,它还需要常量:

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