这两种说法有什么区别
What's the difference between these two statements
>这两个语句有什么区别?
ob.A::ar[0] = 200;
ob.ar[0] = 200;
其中ob
是类 A
的对象
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]
来说是一样的,所以 2 行基本上是一回事,运算符 ::
用于指示命名空间的所谓分辨率,或者只是命名空间。
由于 ob
是 A 类型的对象,因此命名空间解析是隐式的,在访问 ar[0]
之前不需要A::
。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?