问题描述
我有这个:
// 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 } {
}
Player::Player(std::string name_val)
: Player{ name_val,0 } {
}
Player::Player(std::string name_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 };
Player albert{ niels };
niels = { "Margo",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 播放器对象的引用。但这样做的目的是什么?
因为如果我这样做。这无论如何都不会编译:
void display_player_name(const Player p) {
cout << p.get_name() << endl;
}
它会返回相同的结果。
解决方法
%{TIMESTAMP_ISO8601:LogTimestamp}\] \"%{WORD:request_method} (?<swift_v1>(/swift/v1){0,1})/(?<bucketname>(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.{1,})*([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(\?|/\?|/)(?<list_type=2>(list-type=2){0,1})%{GREEDYDATA}%{SPACE}HTTP/1.1\" %{NUMBER:httprespcode:int}
是指向 const Player *p
-const
的指针。根本就不是参考。 (并且您的代码至少因此无法编译)。
如果您需要参考,则需要 Player
。
在 void display_player_name(const Player& p)
中,void display_player_name(const Player p)
是按值传递的,因此在被函数使用之前会被复制。
在这种情况下,两者之间的主要区别在于,在一种情况下复制了值,而在另一种情况下则不复制。
它输出相同,因为您没有更改数据,但是传递指针或引用会更有效,因为您不必复制可能很昂贵的对象(特别是如果多次完成) )。而且没有真正的理由在这里制作副本。