我有这个:
// 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
是通过值传递的,因此它在被函数使用之前会被复制。
在这种情况下,两者之间的主要区别在于,在一种情况下复制值,而在另一种情况中不复制值。
它的输出是一样的,因为你不改变数据,但传递指针或引用会更有效,因为你不用复制你的对象,这可能会很昂贵(尤其是多次(。没有真正的理由在这里复制。