作用域解析运算符 :: 与 this ->

5

我正在尝试理解C++中OOP中指针和作用域的概念。在以下两种情况下,它们是否有任何区别:

class Class 
{  
public:
    void setVal (int value) { 
        this -> value = value;
    }
    int getVal();
private:
     int value;
};

并且这个:

class Class 
{  
public:
    void setVal (int value) {
        Class::value = value;  
    }  
    int getVal();
private:
    int value;
};

4
完全独立的事物。第二句话是指“this->Class::value = true;” 的缩写。 - T.C.
你有没有读过C++书,了解每个函数的作用? - Lightness Races in Orbit
我的书简单地说明它们是等价的,没有进一步解释。 - Jeff-Russ
@T.C. this->valueClass::value 都可以用来访问成员变量。您能否进一步澄清它们为什么是完全正交的事物? - pooya13
1个回答

2
您发布的两个代码片段具有相同的行为,但并不是因为 A->BA::B 从来没有相同的含义。
  • this->value 稍微有点类似于 this->Class::value,因为首先搜索类 Class 中的 value
  • Class::value 稍微有点类似于 this->Class::value,因为在引用成员变量时假定当前对象而不使用 this->

this-> 的意思是“请给我一些属于我正在与您交谈的特定对象的部分”; Class::value 的意思是“请给我名为 Class::value 的东西”。

这种逻辑不完全适用于成员函数,因为自己指定 Class:: 会关闭虚拟调度。 因此,this->foo()this->Class::foo() 不同。


好的,这解释清楚了。谢谢!我假设第一个例子是最常见的。 - Jeff-Russ
1
@Jeff-Russ:确实如此。在非静态的成员函数中,当您使用Class ::来限定该成员时,这是很少见的。 - Lightness Races in Orbit
你的两个要点的第一部分读起来一样。我猜这是一个打字错误?我仍然对这个问题的答案感到困惑,如果您能进一步澄清,我将不胜感激。这个问题是关于this->BA::B之间的区别,而不是A->BA::B - pooya13
@pooya13 没有拼写错误,就按照原样写吧。 :) 无论是静态的还是非静态的“当前”类型成员,都会隐含this->。 对于静态成员而言,这只是语义问题,因为this指针对于静态访问没有用,但是它确实存在;虽然 OP 没有任何静态成员。 A->B甚至不是有效的,因为A是一种类型而不是一个对象。 - Lightness Races in Orbit
我知道 A->B 是无效的。这就是为什么我对你的回答感到困惑。问题是关于 this->BA::B 之间的区别,而不是 A->BA::B 之间的区别,但是你的回答说:“...并不是因为 A->BA::B 意味着相同的事情...”那么 this->BA::B 之间有什么区别呢? - pooya13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接