如果在类中不使用"this"会发生什么情况?

What happens if you don't use "this" within a class?

本文关键字:this 什么情况 如果      更新时间:2023-10-16

假设我有以下类:

class foo{
public:
       int someNum;
       void calculation(int someNum);
};

定义:

void foo::calculation(int someNum){
      someNum = someNum;
}

现在在someNum = someNum行中,哪个someNum被引用?如果我这样做:

this->someNum = someNum

那么第二个someNum是什么?

什么是好的命名风格来避免这个问题?例如,在objective-c中,在成员变量名前加上"_"前缀。(例如:_someNum);

在成员函数内部,参数名隐藏了相同的类成员名,因此在

void foo::calculation(int someNum){
      someNum = someNum;
}

两个someNum s都指向该参数。这是一个不改变this->someNum的自赋值。

this->someNum = someNum;中,第二个someNum为函数参数。因此,这将函数形参someNum的值赋给类成员someNum

常见的命名约定包括类成员的mm_前缀或后缀_。前缀下划线可能会有问题,因为c++保留以下划线开头,后跟大写字母的名称。


注意,构造函数中的成员初始化列表是一种特殊情况:

foo(int someNum) : someNum(someNum) { someNum = someNum; }
                   ^        ^          ^         ^
                   |        |          |         |
                   |        ----------------------
                   |        These three all refer to the parameter 'someNum',
                   |        and not the class member.
                   |
     The language requires this name to be referring
     to a class member (or a base class) and so the  
     parameter called 'someNum' is not considered.

在最内层作用域中声明的变量遮蔽了外部作用域中的变量。因此,foo::calculation中的someNum = someNum'对成员变量someNum没有影响。相反,someNum引用传入的参数。为了帮助缓解这种情况,命名标准建议使用一致的标识符"m_"作为成员变量的前缀,例如。