c++ - C++ 中的 this->variable 和 namespace::class::variable 有什么区别?

标签 c++ class oop namespaces this

考虑一下:

我有一个包含一些私有(private)变量和一些公共(public)方法的类,例如 setter 或构造器。当我实现这些方法时,说 this->variable = 0;namespace::class::variable = 0; 有什么不同吗?

在标题中(example.h):

namespace spc
{
    class MyClass
    {
     public:
            MyClass();
     private:
            int variable;
            int variable2;
    };
}

现在在 cpp 文件 (example.cpp) 中我有:

spc::MyClass::MyClass()
{
     spc::MyClass::variable = 0;
     this->variable2 = 0;
}

这将编译。而且在应用程序源中,此类的构造和对象将具有值为 0 的两个变量(假设我也有一些 setter/getter )。所以我的问题是:这两行代码彼此有什么不同吗?

最佳答案

This will compile

spc::MyClass::variable = 0;
this->variable2 = 0;

没错!但这也会编译,产生相同的结果:

variable = 0;
variable2 = 0;

一般来说,this-> 和作用域解析 :: 运算符可以让您在出现歧义时指示编译器使用哪个变量。例如,构造函数参数可能与成员变量同名:

spc::MyClass::MyClass(int variable2)
{
     this->variable2 = variable2;
}

在这里,this-> 的使用区分了 variable2-the-parameter 和 variable2-the-member of spc::MyClass.

然而,在没有歧义的情况下,使用“普通”变量名对于语言来说是“惯用的”。

注意 MyClass::somethingthis->something 之间的一个区别是当 something 是虚成员函数时;前者会抑制虚拟调用机制,而后者不会(感谢 Sebastian Redl 的精彩评论)。

关于c++ - C++ 中的 this->variable 和 namespace::class::variable 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27861073/

相关文章:

c++ - 使用CMake时如何避免 'cannot open shared object file'?

java - 将 main 方法中定义的参数传递给实例方法?

c# - 当我为所述类编写自己的包装器时,如何将 'hide' 内置于类中?

c++ - 这里出了什么问题? - ISO C++ 禁止声明没有类型的 'Circle'

python - 将类方法作为回调传递(面向对象编程 Python)

python - 连接列表和分割字符串

c++ - nameOfClass myObject((something)someNumber)在类中传递时的含义是什么

c++ - 检查 std::vector 的大小是否为零

c++ - 锁、互斥和临界区之间的区别

php - parent::method() - 调用非静态方法