在const函数中返回“this”指针

时间:2013-02-06 16:05:10

标签: c++

我一直在学习C ++,目前我正在练习课程。 我创建了一个类,用于存储播放器的名称和分数,并定义函数 操纵数据并显示它。

我创建的一个功能是比较两个玩家的得分并返回一个指针 对得分较高的玩家。这是功能:

Player * Player::highestScore(Player  p2)const
{
    if(p2.pScore>pScore)
    {
        return &p2;
    }
    else
    {
        return this;
    }
}

从主要我创建以下玩家:

Player p1("James Gosling",11);
Player *p4 = new Player("Bjarne Stroustrup",5);

我称之为最高分数函数:

Player *highestScore = p1.highestScore(*p4);

然而,正如您在阅读函数本身时可能已经注意到的那样,当我将指针返回到调用该方法的对象时(如果它具有更高的分数),我会收到一条错误消息:

return value type does not match the function type

当我将函数的返回类型声明为const时,这个问题似乎消失了,如下所示:

const Player * Player::highestScore(Player  p2)const

令我困惑的部分是为什么它允许return &p2 const,而不是this并且不允许我返回const,这是指向调用函数的对象,也不是return &p2?即使我将函数返回类型声明为const,它仍允许我{{1}},即使传递给参数的参数不是const Player对象?

很抱歉,如果这个问题看起来很奇怪,或者我正在尝试做的是非常糟糕的编程,但这只是为了通过这样做来学习。

3 个答案:

答案 0 :(得分:6)

  

令我困惑的部分是为什么它允许我返回& p2,它不是const而且不允许我返回它,这是一个指向调用该函数的对象的指针,它不是'也是一个常量?

this const(或者,更确切地说,是const成员函数中的指针 - const),像所有数据成员一样:

#include <iostream>
#include <type_traits>

struct A
{
    void foo()
    {
        std::cout << std::is_same<decltype(this), const A*>::value << '\n';
    }

    void bar() const
    {
        std::cout << std::is_same<decltype(this), const A*>::value << '\n';
    }
};

int main()
{
    A a;
    a.foo();
    a.bar();
}

Output

0
1

  

即使我将函数返回类型声明为const,它仍允许我返回&amp; p2,即使传递给参数的参数不是const Player对象?

我们无法看到您尝试过的内容,但可能是Player* const,这与Player const*(或const Player*)不同。您可以将const添加到&r2就好了;把const带走是另一回事。

答案 1 :(得分:3)

const和非const方法之间的区别在于,在const中的第一个this指针和后者中的this指针。因此,当您尝试从const函数返回非常量指针并返回此时,编译器会抱怨,因为&p2是const,并且const-ness不能自动删除。

&p2只是一个指向参数的指针,因此它不是const。请记住,虽然{{1}}是指向本地变量的指针,但返回 永远不会安全。

答案 2 :(得分:3)

当你有一个“const”函数时,你非常有希望“我们不会在这个调用中更改对象实例”。对于该类型的函数,编译器使this成为const T* this(其中T是类的类型,例如Player)。

显然,返回指向const的指针和非const指针的指针是违反规则的 - 因为一旦某些代码有一个非const指针你的对象,代码可以修改对象......这违背了“这个函数不会修改”的承诺。

因此,将const添加到函数的返回类型是正确的解决方案。

您可能还想更改代码,以便它需要const *Player p2作为输入 - 您当前的代码返回一个指向局部变量的指针[它碰巧是一个参数,但它的原理是相同的 - 它不是函数调用返回时不存在]。

编辑:除非您实际在具有const属性的函数中返回某个内容的副本(例如,整数,字符串或使用例如new分配的新结构),否则返回类型应为{{1} }。