我一直在学习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对象?
很抱歉,如果这个问题看起来很奇怪,或者我正在尝试做的是非常糟糕的编程,但这只是为了通过这样做来学习。
答案 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();
}
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} }。