繁体   English   中英

这两个陈述之间有什么区别

[英]What's the difference between these two statements

这两个陈述有什么区别?

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

其中obA类的对象

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

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

在(多个非虚拟)继承重新定义名称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

在这种情况下,没有区别。

这种表示法:

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是C类,它继承了A类和B类,A和B都有一个字段ar。 然后,没有其他方法可以访问ar,但是要明确指定要引用的继承数据成员。

你应该读这个

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

像这样

A::ar[0]这是同样的事情ar[0]所以两行基本上是相同的事情,操作员::用于指示命名空间的所谓的分辨率 ,或者仅仅是命名空间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM