这两个陈述之间有什么区别?
ob.A::ar[0] = 200;
ob.ar[0] = 200;
其中ob
是类A
class A
{
public:
int *ar;
A()
{
ar = new int[100];
}
};
答案 0 :(得分:6)
没有区别。在这种情况下,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
上查看答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
在这种情况下没有区别。但是,假设ob是C类,它继承了A类和B类,A和B都有一个字段ar。然后,没有其他方法可以访问ar,但是要明确指定您要引用的继承数据成员。
答案 3 :(得分:0)
你应该读这个
ob.A::ar[0] = 200;
ob.ar[0] = 200;
像这样
A::ar[0]
对ar[0]
来说是一回事,所以2行基本相同,运算符::
用于表示命名空间的所谓解析,或者只是命名空间。
由于ob
是A类型的对象,因此名称空间解析是隐式的,在访问A::
之前您不需要ar[0]
。