【问题标题】:What's the matter with 'const Obj' and 'Obj &'?'const Obj' 和 'Obj &' 是怎么回事?
【发布时间】:2011-05-26 14:57:55
【问题描述】:

我想写一个与 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' 禁止任何更改。我不完全了解幕后发生的事情。

【问题讨论】:

    标签: c++ operator-overloading constants


    【解决方案1】:

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

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

    注意末尾的 const:它告诉编译器/用户此方法不会修改类的内部结构。因此,可以在运算符

    【讨论】:

    • 谢谢!确实不正常哈哈哈!我应该改变我认为由编写数千行 Java 代码形成的方式。我的错。
    【解决方案2】:

    你的 getter 必须是常量:

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

    这表明它不会改变对象。

    【讨论】:

    • 我明白了,简而言之,所有函数都必须是 const 函数,由 const 函数调用。
    • 是的。你可以认为每个成员函数都有一个不可见的第一个参数SVertex *this。 @unwind 显示的语法是您声明该参数 const SVertex *this 的方式。
    【解决方案3】:

    您的rhsconst,因此您不能更改它。另一方面,您的 getId 不保证不会更改 this - 它也需要是 const:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2014-04-12
      • 1970-01-01
      相关资源
      最近更新 更多