C ++正确用法,这个指针

时间:2011-11-15 15:09:25

标签: c++ this

  

可能重复:
  When should I make explicit use of the this pointer?

我想知道“this”指针的正确用法。

我见过有人创建了一个类构造函数,其中传递的参数传递给名为'data'的传递变量。 但是他有一个名为'data'的私有成员变量,因此他只使用了:

this->data = data;

可以简单地使用

data = data_in

(如果参数名为data_in),则无需调用“this”指针并引用成员类型。

现在我想知道,这是正确的用法吗?使用this->member来降低命名复杂性?我的意思是它有效,我发现它完成了预期但我想知道你们中有些更有经验的C ++男女生如果这是常见做法会说一两句话吗?

另外,出于好奇,我已经检测了代码只是为了看看幕后发生了什么,似乎无论如何都会调用“this”指针。我猜这就是对类对象的引用的方式。无论如何。

4 个答案:

答案 0 :(得分:6)

在大多数情况下,特别是解除引用this指针以访问类实例的非静态数据成员是不必要的,但它可以帮助命名混淆,特别是当类的数据成员是在代码模块的单独头文件中定义。但是,如果要访问作为模板化类的基类成员的非静态数据成员,则必须才能使用this指针。换句话说,在这样的情况下:

template<typename T>
class base_class
{
    protected:
        int a;
};

template<typename T>
class derived_class : public base_class<T>
{
    void function()
    {
        a = 5; //this won't work
        this->a = 5; //this will work
    }
};

您将注意到必须使用this指针才能从模板基类中正确解析继承的非静态数据成员。这是因为base_class<T>::a是一个依赖名称,在这种情况下依赖于模板参数T,但在没有this指针的情况下使用时,它被视为非依赖名称,因此不会在依赖的基类命名空间中查找。因此,如果没有this指针的特定解引用,您将最终得到编译器错误,例如“a未在此范围内声明”或类似的东西。

答案 1 :(得分:2)

无法访问类成员:

this->member = something;

与自己访问该成员相同,

member = something;

编译器将两者视为相同,并且它们不涉及开销。即使你使用第二种格式,编译器也会像第一种格式一样。

简而言之,尝试使用两种格式中的任何一种以提高性能都是无用的。当然,您可能必须在某些模板案例中使用第一种格式(访问模板化Base类的非静态数据成员),但这不是为了提高性能。

答案 2 :(得分:0)

基本相同,除了杰森所指出的。

好的部分是,如果您使用this->,大多数编辑都会为您编写完整的代码,从而节省您的输入。

答案 3 :(得分:0)

这是&#34;正确&#34;,但它也是不好的做法。命名参数与类成员相同是一个坏主意。故意创建命名冲突是一个坏主意。

作用域运算符是为了在命名冲突不可避免时设计的,例如覆盖基本成员时,或者使用两个独立选择标识符名称的库时。不要认为他们做了愚蠢的事情的免费许可。

除非您正在练习混淆代码竞赛。然后通过各种方式引入命名冲突。