3

我一直在学习 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);

我调用highestScore函数:

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

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

return value type does not match the function type

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

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

让我困惑的部分是为什么它允许我返回return &p2,它不是const也不允许我返回this,它是一个指向调用函数的对象的指针,它也不是const?此外,即使我将函数返回类型声明为 const,它仍然允许我这样做return &p2,即使传递给参数的参数不是 const Player 对象?

对不起,如果这个问题看起来很奇怪,或者我想要做的是非常糟糕的编程,但这只是为了边做边学。

4

3 回答 3

7

令我困惑的部分是为什么它允许我返回 &p2,它不是 const 并且不允许我返回 this,它是指向调用函数的对象的指针,它也不是 const ?

this is 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();
}

输出

0
1

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

我们看不到您尝试了什么,但大概是Player* const,这与Player const*(或const Player*) 不同。你可以添加constness&r2就好了;拿走const是另一回事。

于 2013-02-06T16:06:59.587 回答
3

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

&p2只是一个指向参数的指针,因此它不是 const。请记住,尽管这是指向局部变量的指针,并且返回&p2是不安全的。

于 2013-02-06T16:07:30.770 回答
3

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

显然,返回指向constconst指针对象的指针违反了规则 - 因为一旦某些代码具有const指向对象的非指针,代码就可以修改对象......这违反了“此功能不会修改”。

所以const在这里添加到函数的返回类型是正确的解决方案。

您可能还想更改代码,以便将 aconst *Player p2作为输入 - 您当前的代码返回一个指向局部变量的指针 [它恰好是一个参数,但原理相同 - 当函数调用有回来]。

编辑:除非您实际上是在具有属性的函数中返回某些内容的副本(例如整数、字符串或分配有例如 new 的新结构),const否则返回类型应该是const.

于 2013-02-06T16:12:51.823 回答