Answers:
由于试图使C ++与现有的C代码最兼容(允许对象名称和struct标记之间发生名称冲突),因此C ++允许类名称和对象名称之间发生名称冲突。
意思就是:
struct data {
static int member;
};
struct data2 {
int member;
};
void f(data2& data) {
data.member = data::member;
}
是合法代码。
.
或::
具有不同的效果(data.member
指member
的data
是class 的object data2
,而data::member
指member
的是class的data
)?
::
都更改为,就会产生歧义.
。在某种程度上,您已经回答是。我根本无法破坏您的第一句话。也许我的水平使该评论对我来说似乎烟熏。
两者均有效但引用不同对象的示例:
#include <iostream>
struct A {
int i;
};
struct B {
int i;
A B;
};
int main() {
B x {0, 1};
std::cout << x.B.i << '\n';
std::cout << x.B::i << '\n';
}
让我们扩展@Deduplicator示例:
#include <iostream>
struct A {
int i;
};
struct B : public A {
int i;
A A;
};
int main() {
B x {1, 2};
std::cout << x.i << '\n';
std::cout << x.B::i << '\n'; // The same as the line above.
std::cout << x.A.i << '\n';
std::cout << x.A::i << '\n'; // Not the same as the line above.
}
无法通过::来区分我们想要访问的成员,因此不可能访问在父类中声明的具有相同名称的成员。
A A
(变量名也为类型名)在C ++中无效,因此此示例暂时不起作用