对 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 } {
}

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) 是按值传递的,因此在被函数使用之前会被复制。

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

它输出相同,因为您没有更改数据,但是传递指针或引用会更有效,因为您不必复制可能很昂贵的对象(特别是如果多次完成) )。而且没有真正的理由在这里制作副本。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...