C ++“this”类属性

时间:2013-07-01 09:24:03

标签: c++ class pointers this

//C++ Made Easy HD 26 - Introduction to Classes
//Michael LeCompte

#include <iostream>
#include <string>

using namespace std;


class Player {
public:
    Player() {
        cout << "1st overload" << endl;
    }

    Player(int Health){
        cout << "2nd overload" << endl;
        this->health = Health;
    }

    Player(int Health, int attPow){
        cout << "3nd overload" << endl;
        this->health = Health;
        attackPower = attPow;
    }

    ~Player() {
        cout << "Player instance destroyed" << endl;
    }

    //Mutators
    void setHealth(int val) {
        health = val;
    }

    void setAttPow(int val) {
        attackPower = val;
    }

    void setDef(int val) {
        defense = val;
    }

    void setXp(int val) {
        xp = val;
    }

    //Accessors
    int healthVal() {
        return health;
    }

    int attPowVal() {
        return attackPower;
    }

    int defVal() {
        return defense;
    }

    int xpVal() {
        return xp;
    }

private:
    int health;
    int attackPower;
    int defense;
    int xp;
};


int main() {
    Player player[4] = {Player(2, 5), Player(65, 2), Player(2), Player(1)};
    cout << player[0].healthVal() << endl;
    cout << player[1].healthVal() << endl;
    cout << player[2].healthVal() << endl;

    system("pause");
    return 0;
}

从我上面的代码中我关注的是this->health = Health行。我想知道为什么我需要使用this->health代替health = Health。我知道这与我正在用数组创建新的Player对象这一事实有关(我正在做一个教程)。我只是不明白它为什么会这样,所以我必须使用this->或它是如何工作的。感谢。

6 个答案:

答案 0 :(得分:6)

你不要使用它。 health = Health;会奏效。但正确的方法是使用初始化:

Player(int Health) : health(Health) {
  // constrcutor code
}

答案 1 :(得分:3)

    Player(int Health){
    cout << "2nd overload" << endl;
    this->health = Health;
}

如果你的健康名称是健康的,标题低于你需要使用this指针的标题,因为否则c ++不知道你想使用类变量并将使用参数变量。

在你的例子中,c ++知道要使用哪个(区别在于标题),你可以跳过这个指针。

但是,通过命名约定,健康应该具有较低的标题

答案 2 :(得分:2)

您的示例中不需要使用this->。这是可选的。如果没有this->,您的代码将完全等效。

答案 3 :(得分:1)

这是C ++,而不是python。名称查找使得this-&gt;成员始终被认为没有前缀,只有在引入本地或函数参数来隐藏它时才会被隐藏。 (另一个特殊情况是在模板中访问基类成员。)

不幸的是,一些像VTK这样的图书馆做了这个 - &gt;在他们的风格噪音胡言乱语,所以它像癌症一样蔓延。

在您的示例中没有隐藏,因此没有理由使用前缀。作为单独的注释,在ctors好的代码将使用init列表而不是赋值,并使1-param版本显式。对于这些情况,您甚至可以使用与成员相同的参数名称。

答案 4 :(得分:1)

我唯一一次使用“this”就是当我想明确指出我指的是什么对象时。也就是说,我在复制构造函数和赋值运算符中使用“this”。

答案 5 :(得分:0)

如果您定义了名为health的任何局部变量,那么,为了区分此局部变量与您的类的数据成员,您需要严格使用this指针。在其他情况下,使用this指针也是一种很好的做法,但不是必需的。