在C++类的成员函数中,是否使用this->dataMember
与只使用dataMember
有所区别?哪种方式被认为更好?是否有性能差异?
(我不是在讨论本地变量与数据成员名称相同的情况,在这种情况下,必须使用this->
来区分它们。)
this->
,这也是我偏爱的惯例,但我听说有些人更喜欢系统地使用它。my
或m_
开头,或者参数名称将以the
开头。this->
可以在模板中用于使名称依赖于特定情况。如果模板类继承自依赖类型,并且您想访问基类型的成员,则这很重要。template <typename T>
class Toto : public T
{
public:
int f()
{
return this->g();
}
};
如果没有这里的this->
,g()
将是一个非依赖名称,编译器将在模板定义的上下文中查找它,而不考虑基类。
当我调用成员函数时,我总是使用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();
}
什么被认为是更好的风格?
我认为社区内对此并没有强烈的意见。可以使用任何一种风格,但要保持一致。
有性能差异吗?
我相信没有。
this->
以使访问类成员更加明显。但如果你觉得没有它也很明显,那么生成的代码和性能不会有任何区别。this->
也可能是必需的。)只使用this->
来调用成员是多余的,除非你想快速区分局部变量和成员变量之间的语义差异。
许多人在类成员中使用m_
前缀,以避免一直写this->
。
当您有一个隐藏/私有成员时,请使用此方法=)在其他情况下,它没有任何区别=)
引用IBM信息中心的话:
除非类成员名称被隐藏,否则使用类成员名称等同于使用带有this指针和类成员访问运算符(->)的类成员名称。
使用 "this->" 更好(您可以确定它是成员),但这并没有什么区别
this->
作为替代方法来帮助编译器,而不是MyUtopicClass<int, double, double>::vin()
。vin
是一个虚函数,那么 this->vin()
和 MyUtopicClass<int, double, double>::vin()
是不同的。 - aschepler