这个变量>和命名空间::class::C++变量有什么区别?
What is the difference between this->variable and namespace::class::variable in C++?
考虑一下:
我有一个包含一些私有变量和一些公共方法(例如setters或构造函数)的类。当我实现这些方法时,说this->variable = 0;
或namespace::class::variable = 0;
有什么区别吗?
在标题中(示例.h):
namespace spc
{
class MyClass
{
public:
MyClass();
private:
int variable;
int variable2;
};
}
现在在 cpp 文件(示例.cpp)中,我有:
spc::MyClass::MyClass()
{
spc::MyClass::variable = 0;
this->variable2 = 0;
}
这将编译。同样在应用程序源代码中,此类的构造和对象将具有值为 0 的两个变量(假设我也有一些 getter)。所以我的问题是:这两行代码与每行代码有什么不同吗?
这将编译
spc::MyClass::variable = 0;
this->variable2 = 0;
没错!但这也会编译,产生相同的结果:
variable = 0;
variable2 = 0;
通常,this->
和范围解析::
运算符可用于指示编译器在存在任何歧义时使用哪个变量。例如,构造函数参数可能与成员变量同名:
spc::MyClass::MyClass(int variable2)
{
this->variable2 = variable2;
}
在这里,this->
的使用区分了variable2
参数和variable2
spc::MyClass
的成员。
然而,在没有歧义的情况下,使用"普通"变量名对语言来说是"惯用的"。
注意:MyClass::something
和 this->something
之间的一个区别是当某些东西是虚拟成员函数时;前者会抑制虚拟调用机制,而后者不会(感谢 Sebastian Redl 的精彩评论)。
以下语句相等:
spc::MyClass::MyClass()
{
// Very uncommon
spc::MyClass::variable = 0;
// Use this for clarity, if you feel the need
this->variable = 0;
// Short and common
variable = 0;
}
this->variable
会导致在当前类的范围内查找名称。
MyClass::variable
会导致在 MyClass
的范围内查找名称。
在这种情况下,当前类是MyClass
,所以两者都等价于一个不合格的variable
。
在其他情况下,它们可能不是。例如,Base::member
可能引用基类的成员,而派生类的成员函数中的this->member
可能引用隐藏基类成员的派生类的成员。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用