“返回”;这";常量函数中的指针 我一直在学习C++,现在我正在用课堂练习。 我创建了一个类,该类存储了一个玩家的名字和分数,并定义了一些函数 操纵数据并显示它

“返回”;这";常量函数中的指针 我一直在学习C++,现在我正在用课堂练习。 我创建了一个类,该类存储了一个玩家的名字和分数,并定义了一些函数 操纵数据并显示它,c++,C++,我创建的函数之一是比较两名球员的得分并返回一个指针 给得分较高的球员。这就是功能: Player * Player::highestScore(Player p2)const { if(p2.pScore>pScore) { return &p2; } else { return this; } } Player *highestScore = p1.highestScore(*p4); 我主要创

我创建的函数之一是比较两名球员的得分并返回一个指针 给得分较高的球员。这就是功能:

Player * Player::highestScore(Player  p2)const
{
    if(p2.pScore>pScore)
    {
        return &p2;
    }
    else
    {
        return this;
    }
}
Player *highestScore = p1.highestScore(*p4);
我主要创建以下玩家:

Player p1("James Gosling",11);
Player *p4 = new Player("Bjarne Stroustrup",5);
我将最高分函数称为:

Player * Player::highestScore(Player  p2)const
{
    if(p2.pScore>pScore)
    {
        return &p2;
    }
    else
    {
        return this;
    }
}
Player *highestScore = p1.highestScore(*p4);
但是,正如您在读取函数本身时所注意到的,当我返回指向调用该方法的对象的指针时(如果它有更高的分数),我会得到一个错误,该错误表示:

return value type does not match the function type
当我将函数的返回类型声明为
常量时,这个问题似乎消失了,如下所示:

const Player * Player::highestScore(Player  p2)const
让我困惑的是,为什么它允许我返回&p2
,它不是
const
,也不允许我返回
this
,它是指向调用函数的对象的指针,它也不是
const
?而且,即使我将函数返回类型声明为const,它仍然允许我返回&p2,即使传递给参数的参数不是constplayer对象

很抱歉,如果这个问题看起来很奇怪,或者我想做的是非常糟糕的编程,但这只是为了在实践中学习

让我困惑的是,为什么它允许我返回&p2,它不是常量,也不允许我返回这个,它是指向调用函数的对象的指针,它也不是常量

常量
(或者更准确地说,是指向
常量
)成员函数中的
常量的指针,就像所有数据成员一样:

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

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


我们看不到您尝试了什么,但可能是
Player*const
,这与
Player-const*
(或
const-Player*
)不同。您可以将
const
ness添加到
&r2
即可;将
const
ness拿走是另一回事。

常量和非常量方法的区别在于,在第一种方法中,
这个
指针位于常量中,而在后一种方法中则不是。所以,当您试图从const函数返回非const指针并返回它时,编译器会抱怨,因为这里有
这个
是const,并且不能自动删除const ness

&p2
只是指向参数的指针,因此它不是常量。请记住,尽管
&p2
是指向局部变量的指针,当您有一个“const”函数时,返回

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

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

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

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


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

此先前回答的问题可能会有所帮助--
为const,因为成员函数声明为const。参数
p2
未在参数列表中声明为
const
,因此您可以返回其地址,但请注意,这样做是返回由val推送的堆栈变量的地址,因此如果该地址在成员函数外部被引用,则该行为是未定义的。@WhozCraig:Right,他可能是指
constplayer*Player::highestScore(Player&p2)const
,使用reference@BenVoigt同意,但很难说。对
const
“的不熟悉是一个微妙的暗示,语言的其他属性(比如返回临时地址,或者在他的例子中,
*p4
实际上是由val推动的)也可能还不在他的范围内。@WhozCraig谢谢,这消除了一些混淆。谢谢你的回答。如果你的意思是你看不到我是如何尝试从main初始化p2参数的指针的,那么我是在下面做的:Player*p4=newplayer(“Bjarne Stroustrup”,5);不,我的意思是我们没有看到您试图“将函数返回类型定义为常量”。但没关系。啊,我明白了。那么,函数是否允许我返回一个指向p2的指针,因为它是指向局部变量的指针,因此编译器不会将其设置为常量指针?您被“允许”要从const函数返回指向非const对象的指针-如果返回的值是对象本身内部某个对象的指针或引用,通常不是一个好主意[例如,
this
&this->something
(在ponter的情况下)]-因为这意味着调用代码可以稍后修改您承诺不会修改的内容。