C++ 什么';这两种说法的区别是什么

C++ 什么';这两种说法的区别是什么,c++,oop,C++,Oop,这两种说法有什么区别 ob.A::ar[0] = 200; ob.ar[0] = 200; 其中,ob是类A class A { public: int *ar; A() { ar = new int[100]; } }; 没有区别。在这种情况下,ar的显式名称空间限定是多余的 在(多个、非虚拟的)继承重新定义名称ar的情况下,它可能不是多余的。样本(人为): #包括 甲级 { 公众: int*a

这两种说法有什么区别

ob.A::ar[0] = 200;
ob.ar[0] = 200;
其中,
ob
是类
A

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

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

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

#包括
甲级
{
公众:
int*ar;
A(){ar=new int[100];}
//不相关,但防止泄漏:(三原则)
~A(){delete[]ar;}
私人:
A(常数&);
A&运算符=(常数&);
};
B类:公共A
{
公众:
std::字符串ar[12];
};
int main()
{
B ob;
ob.A::ar[0]=200;
ob.ar[0]=“你好世界”;
}

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

在这种情况下没有区别

此符号:

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;
   }

}

你应该读这个

ob.A::ar[0] = 200;
ob.ar[0] = 200;
像这样

A::ar[0]
对于
ar[0]
来说是一样的,所以这两行基本上是一样的,操作符
::
用于指示名称空间的所谓解析,或者只是名称空间


由于
ob
是类型A的对象,名称空间解析是隐式的,在访问
ar[0]

之前,您不需要
A::
,您能解释一下您在类A中作为私有代码编写的内容吗?@Rushil嗯,这确实离题了:这是防止
A
被复制的最快方法(这将导致双重删除
A::ar
)。在C++11中,它被称为或:)好的。我知道这是离题的,但我想知道这是什么意思。:-)
ob.A::ar[0] = 200;
ob.ar[0] = 200;