我的问题是关于C ++中的这个运算符,我们应该尽可能多地使用它吗?我给出了以下示例来说明我的观点:
class Abc
{
public:
int a_;
void fun();
};
void Abc::fun()
{
// option 1
a_ = 3;
// option 2
this->a_ = 3;
}
在函数类成员fun()
中,我们可以用两种方式调用成员变量,一种是使用this->
而另一种是不使用它。所以我的问题是:鼓励哪种做法?谢谢。
答案 0 :(得分:4)
如果变量和参数的名称相同,则必须使用this
。
class Foo
{
public:
int _a;
void func(int _a) {
this->_a = _a;
}
};
在引用依赖于当前类的模板参数的基类成员时,还需要 this
。
否则,没有必要使用this
。
答案 1 :(得分:4)
在一般情况下,你可以同时使用两者。在这种情况下,这只是一种风格问题,正确的做法是遵循项目的风格指南。在这方面,一致性比个人偏好更重要。
但是,使用this->
有两种情况可以产生影响。一种是当成员函数具有与成员同名的参数时;在这种情况下,参数的名称会隐藏成员的名称,您必须使用this->
来引用该成员(首先由@ Krypton的答案指出):
void Abc::fun(int a_)
{
a_ = 3; // assigns into the parameter
this->a_ = 3; // assigns into the data member
}
另一种情况是,当您在类模板中工作时,该成员继承自基类,该基类依赖于类模板的模板参数。在这种情况下,非限定查找不会搜索依赖上下文,因此将找不到该成员。使用this->
将访问转换为依赖表达式,该表达式将在实例化时查找,从而正确地解析为成员。例如:
template <class T>
struct Base
{
protected:
T a_;
};
template <class T>
struct Abc : Base<T>
{
void fun() {
a_ = 3; // error, not `a_` in scope
this->a_ = 3; // OK, found at instantiation time
}
};
在这种情况下,存在另一种解决方案:明确显示名称:
template <class T>
struct Abc : Base<T>
{
protected:
using Base<T>::a_;
public:
void fun() {
a_ = 3; // OK, found thanks to `using` declaration
}
};
答案 2 :(得分:1)
我认为这更像是一种风格问题。使用额外的this->
不会更改生成的代码。
虽然你不能在构造函数体之前的类成员初始化中使用operator this->
,比如
class Abc {
public:
Abc(int i): /*this-> is incorrect*/i(i) {}
private:
int i;
};
我更喜欢使用this->
与其他无类成员有明显区别。
然后像下面这样的代码更具可读性
void foo(int i) { }
class Abc {
public:
Abc(int j) { this->foo(j); }
private:
void foo (int i) { this->i = i; }
int i;
};
有些人将以m_
开头的班级数据成员命名为m_i
,m_j
。
一些现代IDE支持语义语法突出显示,这也有助于区分局部变量,类数据成员,全局变量,函数。