C++的正确用法,this指针

4

可能是重复问题:
何时应明确使用this指针?

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

我看到有人创建了一个类构造函数,其中传递的参数变量被命名为“data”。 然而,他已经有一个名为“data”的私有成员变量,因此他简单地使用:

this->data = data;

如果参数被命名为data_in,则只需使用

data = data_in

(并没有必要调用“this”指针并引用成员类型)。

现在我想知道,这是正确的用法吗?使用this->member来减少命名复杂性?我的意思是它可以工作,我看到它实现了预期的效果,但我想知道你们更有经验的C++程序员能否说一两句这是否是常见做法?

另外,出于好奇,我已经对代码进行了仪器化,以查看在幕后发生了什么,似乎“this”指针无论如何都被调用。我猜这是引用类对象的方式。


这只是个人口味问题。有些人会用不同的方式命名,有些人会赋值为 : data(data)(如果适用),有些人会使用 this->data,还有一些人会选择 classname::data。任何符合你审美的方式都可以。 - Michael Krelin - hacker
4个回答

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未在此范围内声明”或类似的错误。

你的代码片段 "a=5" 没有 "this->" 可以在 VisualStudio 上编译。 - Peng Zhang
哦,gcc里没有……你遇到了我描述的问题……http://ideone.com/H7DDza - Jason

2
不要将类成员访问写成:
this->member = something;

访问成员本身和访问其相同。

member = something;

编译器认为两者相同,没有额外的开销。即使您使用第二种格式,编译器在底层也会执行与第一种格式相同的操作。

简而言之,试图使用这两种格式中的任何一种来提高性能都是无用的。当然,在某些模板情况下(访问模板基类的非静态数据成员)可能需要使用第一种格式,但这并不是为了性能。


1
在 @Jason 指出的情况下... - Oliver Charlesworth
当然,值得一提的是,我认为OP提问的主要目的是与性能相关的。 - Alok Save

0

本质上是相同的,就像Jason指出的那样。

好处在于,如果你使用this->,大多数编辑器都会为你自动完成代码,节省你的打字时间。


0

这是“正确”的,但也是不良实践。将参数命名为类成员是一个坏主意。故意创建命名冲突是一个坏主意。

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

除非你正在练习混淆代码比赛。那么请介绍命名冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接