2011-05-26 103 views
2

我想写一个与std :: set兼容的类,所以我重载了像这样的“少于”运算符。有用。'const Obj'和'Obj&'有什么关系?

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;} 

这原来是一个编译时错误:无法从转换“这个”指针“常量段:: SVertex”到‘段:: SVertex &’

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

我只知道'&'表示通过引用传递,'const'禁止任何更改。我不完全了解幕后发生的事情。

回答

7

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

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

注意常量结尾:它告诉编译器/用户,这种方法不会修改类的内部。因此,可以在您的运营商<中使用它,这也是常量。 如果Const成员函数也是const,则它只能调用其他成员函数;非const成员函数可以调用任何。

+0

谢谢!这真的不是正常的哈哈!我应该改变我认为从编写数千行Java代码形成的方式。我的错。 – fwonce 2011-05-26 15:08:01

5

你消气必须是恒定的:

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

这标志着它不会改变对象。

+1

我明白了,所以在螺母,所有功能都必须是const这是由一个const函数调用。 – fwonce 2011-05-26 15:02:12

+0

是的。你可以将每个成员函数想象成具有不可见的第一个参数'SVertex * this'。 @unwind显示的语法是你如何声明'const SVertex * this'这个参数。 – Nemo 2011-05-26 15:07:34

2

你的rhsconst,所以你不允许改变它。在另一方面你getId没有承诺不改变this - 它也需要是const:

int SVertex::getId() const { return id; } 
相关问题