对const播放器对象的引用



我有这个:

// Const in Classes
#include <iostream>
#include <string>
using namespace std;
class Player
{
private:
std::string name;


public:

std::string get_name() const  {         // consty method
return name;
}
void set_name(std::string name_val) {
name = name_val;
}
// Overloaded Constructors
Player();
Player(std::string name_val);
Player(std::string name_val, int health_val, int xp_val);
};
Player::Player()
: Player{ "None",0,0 } {
}
Player::Player(std::string name_val)
: Player{ name_val,0, 0 } {
}
Player::Player(std::string name_val, int health_val, int xp_val)
: name{ name_val }, health{ health_val }, xp{ xp_val } {
}
void display_player_name(const Player *p) {
cout << p.get_name() << endl;
}
int main() {
const Player villain{ "Villain", 100, 55 };
Player niels{ "Niels", 100, 100 };
Player albert{ niels };
niels  = { "Margo", 100, 555 };
cout << villain.get_name() << endl;
display_player_name(niels);
display_player_name(albert);  

cout << villain.get_name() << endl;
return 0;
}

我的问题是关于这段代码:

void display_player_name(const Player *p) {
cout << p.get_name() << endl;
}

这是一个const播放器对象的ref。但这样做的目的是什么?

因为如果我这样做。无论如何都不会编译:

void display_player_name(const Player p) {
cout << p.get_name() << endl;
}

它将返回相同的结果。

const Player *p是指向const-Player指针。这根本不是参考资料。(至少因为这个原因,您的代码无法编译(。

如果你想要推荐信,你需要void display_player_name(const Player& p)

void display_player_name(const Player p)中,Player是通过值传递的,因此它在被函数使用之前会被复制。

在这种情况下,两者之间的主要区别在于,在一种情况下复制值,而在另一种情况中不复制值。

它的输出是一样的,因为你不改变数据,但传递指针或引用会更有效,因为你不用复制你的对象,这可能会很昂贵(尤其是多次(。没有真正的理由在这里复制。

最新更新