21xrx.com
2024-12-22 19:41:03 Sunday
登录
文章检索 我的文章 写文章
C++中的双冒号(::)用法详解
2023-06-26 17:52:29 深夜i     --     --
C++ 双冒号(::) 用法 详解

C++ 中的双冒号(::)是一个很重要的符号,在程序中有许多用法。下面我们来仔细分析双冒号的用法。

1.作用域限定符

双冒号的最基本用法就是作为作用域限定符,限定一个变量或函数在特定的命名空间内。例如:


namespace A {

  int a = 3;

  void func() {

    std::cout << "This is A::func()." << std::endl;

  }

}

namespace B {

  int a = 4;

  void func() {

    std::cout << "This is B::func()." << std::endl;

  }

}

int main() {

  std::cout << A::a << std::endl; // 输出 3,限定了 a 在 A 命名空间内

  B::func(); // 输出 This is B::func(),限定了 func() 在 B 命名空间内

  return 0;

}

2.类成员访问符

使用双冒号,可以在类外定义或访问一个类的静态成员变量或静态成员函数。例如:


// MyClass.h

class MyClass {

public:

  static int s_a;

  static void s_func();

};

// MyClass.cpp

int MyClass::s_a = 0;

void MyClass::s_func()

  std::cout << "This is a static function." << std::endl;

// main.cpp

int main() {

  MyClass::s_func(); // 输出 This is a static function.

  MyClass::s_a = 10;

  std::cout << MyClass::s_a << std::endl; // 输出 10

  return 0;

}

3.命名空间别名

双冒号还可以用于给一个命令空间起别名。例如:


namespace A

  int a = 3;

namespace myns = A;

int main()

  std::cout << myns::a << std::endl; // 输出 3

  return 0;

在这个例子中,通过双冒号把命名空间 A 起个别名 myns,然后就可以用 myns::a 访问 A 的成员了。

4.类型限定符

有时候为了避免类型歧义和命名冲突,需要通过双冒号限定类型。例如:


class A {

public:

  void func() {

    std::cout << "This is A::func()." << std::endl;

  }

};

class B : public A {

public:

  void func() {

    A::func(); // 调用基类的 func()

    std::cout << "This is B::func()." << std::endl;

  }

};

int main() {

  B b;

  b.func(); // 输出 This is A::func(). This is B::func().

  return 0;

}

在这个例子中,类 B 继承自类 A,并且重写了 A 的 func()。在 B 的 func() 中,通过双冒号调用 A 的 func(),限定了要调用的函数是在 A 类型中定义的。

5.常量表达式

双冒号还可以用于常量表达式,例如:


int a = 10 + 20; // 普通的常量表达式

int b = std::numeric_limits<int>::max(); // 使用常量表达式计算一个 int 类型的最大值

在这个例子中,std::numeric_limits ::max() 是一个常量表达式,计算出了 int 类型的最大值。

总之,双冒号在 C++ 中的用途是非常广泛的。几乎在任何有名称的地方都可以使用双冒号,它可以被用来限定作用域、访问成员、给命名空间起别名、限定类型,还可以用于常量表达式等。掌握双冒号的用法对于学好 C++ 编程是非常重要的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复