3

我想知道在 C++ 中使用“this”来引用类成员而不是不使用它有什么好处吗?

例如...

class Test
{
    public:
        Test();
        void print_test()
            {
                std::cout << this -> m_x   // Using 'this'
                          << endl;

                std::cout << m_x          // Rather than referencing 'm_x' this way
                          << endl;
            }
    private:
        int m_x;
        int m_y;
};
4

4 回答 4

5

不,没有性能差异。对于编译器,含义是相同的。

好吧,几乎……您唯一需要说this的是,如果您在内部范围中有一个同名的变量,它会隐藏成员变量(无论如何这被认为是错误的形式),或者您有一个模板化的有趣情况基类,您需要告诉编译器名称指的是基类成员(尽管这种情况很少见)。

于 2013-11-18T06:32:12.397 回答
2

有时这只是一个约定。

基本思想是我们通常需要使用this->来避免命名冲突:

class Value
{
public:
    Value(): value(0), valueSet(false) {}

    void setValue(int value) {
        //value = value; ( WRONG : Naming conflict )
        this->value = value; // Use this-> to distinguish between them
        valueSet = true;
    }

private:
    int value;
    bool valueSet;
}

现在valueSet = true;没有的声明this->看起来很难看。所以人们更喜欢前缀this->来让所有的东西看起来一致:

    void setValue(int value) {
        this->value = value;
        this->valueSet = true; // Isn't this consistent and beautiful?
    }

但据我对 C++ 的了解,这种模式并没有被广泛使用。如果您曾经看过一些Java源代码,那么this.在成员字段访问之前添加前缀是很常见的。

PS:另一个可能的原因可能是人们只是想强调它是一个成员字段,而不是其他东西。由于大多数简单的编辑器无法突出显示这些字段,因此可以提高代码的可读性。

于 2013-11-18T08:57:38.387 回答
0

不。否则每个人都会编写这样的代码。也许有人认为它很容易阅读。也许他是一名Java开发人员。

于 2013-11-18T06:26:07.453 回答
0

如果你不使用它,它将被暗示。所以这两个写入在编译后的代码中是等价的,因为编译器会添加this.

唯一可能出现的问题是变量名的歧义。但只要你使用前缀(或后缀)成员的约定 with m_or_m你应该是安全的。

您还可以看到我什么时候应该明确使用 `this` 指针?

于 2013-11-18T06:22:15.353 回答