双冒号(::)用法

本文详细解析了C++中双冒号(::)的三种使用场景:域操作符、全局作用域符号和作用域成员运算符。通过具体的例子,解释了如何在类中引用成员函数及变量,并在不同情况下使用双冒号解决命名冲突。
2.双冒号(::)用法

  (1)表示“域操作符”

  例:声明了一个类a,类a里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,

  就要写成voida::f(),表示这个f()函数是类a的成员函数。

  (2)直接用在全局函数前,表示是全局函数

  例:在vc里,你可以在调用api函数里,在api函数名前加::

  (3)表示引用成员函数及变量,作用域成员运算符
1、 
作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member 



2、 
全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如: 

char zhou; //全局变量 

void sleep() 

{ 

char zhou; //局部变量 

char(局部变量) = char(局部变量) *char(局部变量) ; 

::char(全局变量) =::char(全局变量) *char(局部变量); 

} 


3、 
::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如

 

  1. 01  class CA {    
  2. 02  public:    
  3. 03    int ca_var;    
  4. 04    int add(int a, int b);    
  5. 05    int add(int a);    
  6. 06  };   
  7. 07      
  8. 08  //那么在实现这个函数时,必须这样书写:    
  9. 09  int CA::add(int a, int b)    
  10. 10  {    
  11. 11    return a + b;    
  12. 12  }    
  13. 13      
  14. 14  //另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:    
  15. 15  int CA::add(int a)    
  16. 16  {    
  17. 17    return a + ::ca_var;    
  18. 18  }   
  19. 19      
  20. 20  //表示当前类实例中的变量ca_var。  

### C++ 双冒号 `::` 运算符的使用场景和作用 #### 1. 访问命名空间中的成员 当需要访问特定命名空间内的对象或函数时,可以使用双冒号来指定该对象或函数属于哪个命名空间。例如,在标准库中经常使用的输入输出流: ```cpp using std::cout; int main() { int a; std::cin >> a; cout << a << std::endl; return 0; } ``` 这段代码展示了如何通过 `std::cin` 和 `std::cout` 来读取并打印整数变量 `a` 的值[^1]。 #### 2. 调用全局范围内的同名实体 如果局部范围内存在与全局变量相同名称的对象,则可以通过前置双冒号的方式强制引用全局版本而非当前作用域内定义的那个版本。比如下面的例子说明了这一点: ```cpp #include <iostream> int count = 5; void func(){ int count = 10; printf("local count=%d\n",count); printf("global count=%d\n",__count); // 错误写法 printf("global count=%d\n",::count); // 正确写法 } int main(){ func(); return 0; } ``` 此示例表明即使在函数内部重新声明了一个名为 `count` 的局部变量,仍然能够利用 `::count` 明确指向外部全局级别的那个 `count` 实体[^5]。 #### 3. 静态成员函数或静态数据成员的调用 对于类而言,有时候会遇到一些不需要实例化就能被直接调用的方法或者是共享给所有对象的数据字段;此时就可以借助于双冒号操作符来进行此类方法或属性的操作而无需创建任何具体实例: ```cpp class MyClass{ public: static void myStaticMethod(){} }; // 不必先建立MyClass类型的对象即可执行myStaticMethod() MyClass::myStaticMethod(); ``` 上述片段体现了不依赖于某个具体的类实例也能成功触发其静态成员的行为模式[^3]。 #### 4. 继承关系下的基类构造器调用 派生类可以在自己的构造函数里显式地调用父类(即基类)相应的构造子以完成必要的初始化工作,这同样需要用到双冒号语法结构: ```cpp class Base { protected: int value_; public: explicit Base(int v):value_(v){} }; class Derived : public Base { private: double factor_; public: Derived(int v,double f) :Base(v),factor_(f){} }; ``` 在此处可以看到衍生自 `Base` 类的新类型 `Derived` 是怎样在其自身的构建过程中传递参数给前者从而实现继承机制下更复杂的逻辑处理需求[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值