在C++中的一个类的成员函数中,如果我使用this->dataMember或只是 dataMember?它会有所作为吗?什么被认为是更好的风格?有任何性能差异吗?
(我不是在谈论局部变量与数据成员同名的情况,在这种情况下,据我所知,您必须使用它this->来区分它们.)
Jam*_*nze 31
作为一般规则,这是一个地方惯例的问题.this->除非必要,我见过的大多数地方都没有使用,这也是我更喜欢的惯例,但我听说有人喜欢系统地使用它.
有必要时有两种情况.第一个是你在本地范围内隐藏了同名的名字; 如果您有一个名为的成员toto,并且您还命名了您的函数参数toto.许多编码约定标记成员或argments以避免这种情况,例如所有成员名称以my或开头m_,或者参数名称将以the.
另一种情况是this->可以在模板中使用以使名称相关.如果模板类继承自依赖类型,并且您想要访问基类的成员,则这是相关的,例如:
template <typename T>
class Toto : public T
{
public:
int f()
{
return this->g();
}
};
Run Code Online (Sandbox Code Playgroud)
如果没有this->这里,g()将是一个非依赖名称,编译器将在模板定义的上下文中查找它,而不考虑基类.
这是一种风格问题.有些人喜欢这个额外的东西this->,让你更明显的是你正在访问一个班级成员.但如果你觉得没有它就足够明显,生成的代码或性能就没有区别了.
(除了您提到的重叠范围的情况,this->在尝试命名依赖于类型的基类的成员时,在模板中也是必需的.)
我总是this在调用成员函数时使用.
self是强制性的,所以这对我来说不是一个真正的负担.但对于数据成员,我只在必要时使用它,因为没有ADL发生.回答您的具体问题:
在C++中的类的成员函数中,如果我使用this-> 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();
}
Run Code Online (Sandbox Code Playgroud)
什么被认为是更好的风格?
我不认为社区内有这方面的强烈意见.使用任何一种风格,但要保持一致.
有任何性能差异吗?
我很确定没有.