5

这两种说法有什么区别?

ob.A::ar[0] = 200;
ob.ar[0] = 200;

ob类的对象在哪里A

class A
{
    public:
        int *ar;
        A()
        {
            ar = new int[100];
        }
};
4

4 回答 4

6

没有区别。在这种情况下,显式命名空间限定ar是多余的。

在(多个,非虚拟)继承重新定义 name 的情况下,它可能不是多余的ar。样本(人为):

#include <string>

class A 
{
    public:
        int *ar;
        A() { ar = new int[100]; }
        // unrelated, but prevent leaks: (Rule Of Three)
       ~A() { delete[] ar; }
    private:
        A(A const&);
        A& operator=(A const&);
};

class B : public A
{
    public:
        std::string ar[12];
};


int main()
{
    B ob;
    ob.A::ar[0] = 200;
    ob.ar[0] = "hello world";
}

在http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203上查看

于 2012-10-14T19:52:59.073 回答
5

在这种情况下没有区别。

这个符号:

obj.Class::member

只是为了解决来自继承的歧义:

class A {
public:
  int a;
}

class B {
public:
  int a;
}

class C : public A, B {
   void func() {
      // this objects holds 2 instance variables of name "a" inherited from A and B
      this->A::a = 1;
      this->B::a = 2;
   }

}
于 2012-10-14T19:56:31.817 回答
1

在这种情况下没有区别。但是想象一下 ob 属于 C 类,它继承自 A 类和 B 类,并且 A 和 B 都有一个字段 ar。那么除了显式指定您引用的继承数据成员之外,没有其他方法可以访问 ar。

于 2012-10-14T19:54:22.910 回答
0

你应该读这个

ob.A::ar[0] = 200;
ob.ar[0] = 200;

像这样

A::ar[0]对于 是一样的ar[0],所以2行基本上是一样的,操作符::用来表示所谓的命名空间解析,或者只是命名空间。

因为ob是 A 类型的对象,所以命名空间解析是隐式的,A::在访问ar[0].

于 2012-10-14T20:00:52.107 回答