我想知道“this”指针的正确用法。
我见过有人创建了一个类构造函数,其中传递的参数传递给名为'data'的传递变量。 但是他有一个名为'data'的私有成员变量,因此他只使用了:
this->data = data;
可以简单地使用
data = data_in
(如果参数名为data_in),则无需调用“this”指针并引用成员类型。
现在我想知道,这是正确的用法吗?使用this->member
来降低命名复杂性?我的意思是它有效,我发现它完成了预期但我想知道你们中有些更有经验的C ++男女生如果这是常见做法会说一两句话吗?
另外,出于好奇,我已经检测了代码只是为了看看幕后发生了什么,似乎无论如何都会调用“this”指针。我猜这就是对类对象的引用的方式。无论如何。
答案 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;,但它也是不好的做法。命名参数与类成员相同是一个坏主意。故意创建命名冲突是一个坏主意。
作用域运算符是为了在命名冲突不可避免时设计的,例如覆盖基本成员时,或者使用两个独立选择标识符名称的库时。不要认为他们做了愚蠢的事情的免费许可。
除非您正在练习混淆代码竞赛。然后通过各种方式引入命名冲突。