作用域运算符

  • global scope(全局作用域符),用法(::name)

  • class scope(类作用域符),用法(class::name)

  • namespace scope(命名空间作用域符),用法(namespace::name)

他们的作用都是为了更明确的调用你想要的变量。:: 如果前面有东西那么一定是命名空间名或者是类名。

  1. #include <iostream>
  2. using namespace std;
  3. int count = 0;
  4. struct FHello {
  5. static const int count = 10;
  6. };
  7. void main() {
  8. int count = 20;
  9. cout << count << endl;
  10. cout << ::count << endl;
  11. cout << FHello::count << endl;
  12. }
  13. // 20
  14. // 10
  15. // 0

相当于在类的定义里定义一个静态变量/函数,那么这个变量就属于这个类了,需要加上 :: 才可以访问到。或者通过对象来访问也可以。编译器编译时,全部会替换类名调用。

  1. #include <iostream>
  2. using namespace std;
  3. struct FHello {
  4. static void hello() {
  5. cout << "213" << endl;
  6. };
  7. static const int count = 10;
  8. };
  9. int main() {
  10. FHello Hello;
  11. Hello.hello();
  12. cout << Hello.count << endl;
  13. }

作用域也是有当前作用域的,例如在类中可以忽略 FHello::a 来访问 a 。

  1. struct FHello {
  2. static int hello() {
  3. return a + b;
  4. };
  5. static int a;
  6. static int b;
  7. };

通过类名来定义指针

  1. struct Student {
  2. int a;
  3. int b;
  4. float c;
  5. }
  6. int main() {
  7. Student wang {1, 2, 3.0};
  8. int Student::*p = &Student::a;
  9. wang.*p = 1;
  10. return 0;
  11. }

看一个指针指向什么要看解引用后表示什么东西,p 解引用后表示 Student 类型中的 int 成员,因此 p 指向的是 Student 类中的 int 成员。

类似的有 int (*q)[5]q 解引用后表示长度为 5 的 int 数组。

菱形继承中的 ::

上面讲的主要是静态变量/函数,接下来我们看 :: 在普通成员中的使用。

  1. #include <iostream>
  2. using namespace std;
  3. class A {
  4. public:
  5. int m_a = 1;
  6. };
  7. class B :public A {
  8. public:
  9. int m_b;
  10. };
  11. class C :public A {
  12. public:
  13. int m_c;
  14. };
  15. class D :public B, public C {
  16. public:
  17. void hello() {
  18. cout << B::m_a << endl;
  19. }
  20. };
  21. int main() {
  22. D d;
  23. d.hello();
  24. return 0;
  25. }

使用 :: 来解决继承中的冲突。