在C ++类的成员函数中,如果我使用this->dataMember
或只是dataMember
,它会有所作为吗?什么被认为是更好的风格?有没有性能差异?
(我不是在讨论局部变量与数据成员同名的情况,在这种情况下,据我所知,您必须使用this->
来区分它们。)
答案 0 :(得分:28)
作为一般规则,这是地方惯例的问题。大部分的
我见过的地方除非必要,否则不会使用this->
我也喜欢这个惯例,但我听说过喜欢的人
系统地使用它。
有必要时有两种情况。首先是你隐藏了
本地范围内具有相同名称的名称;如果是你有一个成员
命名为toto
,您还将函数参数命名为toto
。许多
编码约定标记成员或argments以避免这种情况
案例,例如所有成员名称均以my
或m_
或参数名称开头
将以the
开头。
另一种情况是this->
可以在模板中用来制作名称
依赖。如果模板类继承自a,则这是相关的
依赖类型,并且您想要访问基类的成员,例如:
template <typename T>
class Toto : public T
{
public:
int f()
{
return this->g();
}
};
如果没有this->
,g()
将是一个非依赖名称,而且。{
编译器会在模板定义的上下文中查找它,
没有考虑基类。
答案 1 :(得分:7)
这是一种风格问题。有些人喜欢额外的this->
,以便更明显地说你正在访问一个班级成员。但是如果你觉得没有它就足够明显,生成的代码或性能就没有区别了。
(除了您提到的重叠范围的情况之外,在尝试命名依赖于类型的基类的成员时,this->
在模板中也是必需的。)
答案 2 :(得分:5)
使用this->
来调用成员是多余的,除非您希望在语义上快速区分本地成员和成员。
很多人使用m_
前缀作为班级成员,以避免一直写this->
。
答案 3 :(得分:5)
在调用成员函数时,我总是使用this
。
self
是强制性的,所以这对我来说不是真正的负担。但对于数据成员,我只在必要时才使用它,因为没有ADL发生。回答您的具体问题:
在C ++类的成员函数中,如果我使用this-&gt; dataMember或只是dataMember,它会有所作为吗?
是的,如果这是在类模板中。然后dataMember
被视为非依赖名称,这可能导致语义差异。例如:
#include <iostream>
int i = 1;
struct R {
int i;
R(): i(2) { }
};
template<typename T>
struct S: T {
void f() {
std::cout << i << ' ' // selects ::i
<< this->i // selects R::i
<< std::endl;
}
};
int main() {
S<R>().f();
}
什么被认为是更好的风格?
我不认为社区内有这方面的强烈意见。使用任何一种风格,但要保持一致。
有任何性能差异吗?
我很确定没有。
答案 4 :(得分:1)
当你有一个隐藏/私有成员=)时使用它,在任何其他情况下它没有区别=)
来自IBM信息中心,我引用以下内容
除非隐藏类成员名称,否则使用类成员名称 相当于使用带有this指针的类成员名称 类成员访问运算符( - &gt;)。
答案 5 :(得分:0)
使用“this-&gt;”更好(你确定它是成员),但它没有什么区别
答案 6 :(得分:0)
如果模板函数调用成员函数,使得调用不依赖于任何模板参数,this->
可用于帮助编译器替代MyUtopicClass<int, double, double>::vin()
。