函数const返回类型:

时间:2016-01-19 20:50:37

标签: c++ function reference const

我有这个功能:

Triangle& Triangle::get_largest_triangle(const Triangle& t) const
{
    float area_this = get_area();
    float area_other = t.get_area();

    if (area_other > area_this)
        return *this;
    else
        return t;
}

除非我声明返回的Triangle是常量,即:

,否则这不起作用
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const

这是为什么?我是C ++的新手,但据我所知,“这个”和参数列表中的对象都没有在函数中被更改,所以我真的没有看到问题所在。

e.g。如果我想在运行此函数后更改存储在最大三角形中的某些值,该怎么办?

6 个答案:

答案 0 :(得分:2)

此函数返回对三角形的非const引用。这意味着调用者可以修改返回的对象。但是它返回对自身的引用(由于函数声明而是const),或者对函数参数(也是const)的引用。所以编译器不会允许它,因为你正在使const对象成为非const。

您可以选择更改函数签名以返回const:

const Triangle& Triangle::get_largest_triangle(const Triangle& t) const

或者使方法成为非const并采用非const引用:

Triangle& Triangle::get_largest_triangle(Triangle& t)

答案 1 :(得分:1)

当您返回t时,会返回const Triangle&t的类型。 当您声明函数返回Triangle&时,您将返回不同的类型。请记住,const是该类型的一部分 Triangle&不是const Triangle&

只需将get_largest_triangle的返回类型更改为const Triangle&,或将t的类型更改为Triangle&。两者都有他们的缺点和优点。

答案 2 :(得分:1)

考虑使用您的功能

const Triangle t1, t2;
Triangle &t3 = t1.get_largest_triangle(t2);

t3现在可以修改,但这是对t1t2的引用。因此,您的代码可能会“意外地”丢弃对象的常量。如果这是可能的,那么c ++类型系统将不安全。

理论上,因为t1t2是const,它们可以在非可变形内存中分配,当你尝试通过t3更改其中一个时,你可以这样做可能会崩溃。

答案 3 :(得分:1)

您正在尝试将t(对const Triangle的引用)转换为对可修改Triangle的引用。这将允许调用者修改t,这将是一件坏事。

您需要更改退货类型,使其成为const

答案 4 :(得分:1)

您已将函数定义为const,即不更改对象的状态:

Triangle& Triangle::get_largest_triangle(const Triangle& t) const

问题是你返回一个非const引用:

  • 如果你返回* this,非const引用可以用来改变对象的状态。
  • 如果你返回t,非const引用可以用来修改一个你说不会改变的对象。

这就是编译器抱怨的原因。只是说你返回一个const的引用来解决你的问题:

const Triangle& Triangle::get_largest_triangle(const Triangle& t) const

答案 5 :(得分:0)

将const引用传递给方法,编译器保证对象不会被更改。您尝试返回同一对象的非const引用,这将导致其失去其常量,并且编译器阻止您这样做。

重新思考,如果你在这里做正确的事情。为什么不能对t使用非const引用,或者返回const引用?