当前位置: 首页 > news >正文

【C++指南】作用域限定符 :: 使用详解

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

1b7335aca73b41609b7f05d1d366f476.gif

目录

引言 

1. 访问全局变量

2. 命名空间中的成员访问

3. 类的静态成员访问

4. 嵌套命名空间/类中的成员访问

总结


引言 

在C++中,作用域限定符(Scope Resolvers)主要用于访问特定作用域中的成员,特别是在处理类、命名空间(Namespace)等复杂结构时非常有用。它们帮助编译器确定某个标识符(如变量名、函数名等)的精确作用域,从而避免命名冲突和歧义。

最常用的作用域限定符是::(双冒号),用于访问全局变量命名空间中的成员以及类的静态成员

下面我们将详细探讨这些用法。

1. 访问全局变量

在函数内部,如果局部变量与全局变量同名,局部变量的作用域会覆盖全局变量的作用域。

此时,如果要访问全局变量,就需要使用::操作符。不过,通常不推荐在函数内部使用全局变量,因为这会增加代码的耦合度和复杂度。但为了演示作用域限定符的用法,这里给出一个例子:

#include <iostream>  int x = 5; // 全局变量  void func() {  int x = 10; // 局部变量  std::cout << ::x << std::endl; // 使用::访问全局变量x,输出5  std::cout << x << std::endl; // 访问局部变量x,输出10  
}  int main() {  func();  return 0;  
}


2. 命名空间中的成员访问

命名空间是C++中用于组织代码的一种方式,可以避免全局命名冲突。在访问命名空间中的成员时,可以使用::操作符来指定命名空间。

关于命名空间的更多详细内容,可以参考文章

【C++指南】命名空间-CSDN博客

#include <iostream>  namespace Math {  int add(int a, int b) {  return a + b;  }  
}  int main() {  std::cout << Math::add(2, 3) << std::endl; // 访问Math命名空间中的add函数  return 0;  
}


3. 类的静态成员访问

类的静态成员(包括静态变量和静态成员函数)属于类本身,而不是类的某个具体对象。因此,在访问这些静态成员时,可以使用类名和作用域限定符::

#include <iostream>  class MyClass {  
public:  static int count; // 静态成员变量  static void printCount() { // 静态成员函数  std::cout << "Count: " << count << std::endl;  }  
};  int MyClass::count = 0; // 静态成员变量初始化  int main() {  MyClass::count = 5; // 访问并修改静态成员变量  MyClass::printCount(); // 调用静态成员函数,输出:Count: 5  return 0;  
}

注意:

类的非静态成员(包括成员变量和成员函数)通常不能直接通过作用域限定符(::)来访问,因为非静态成员是依赖于类的具体对象的。 


4. 嵌套命名空间/类中的成员访问

当命名空间或类嵌套时,可以通过连续使用::操作符来访问深层的成员。

namespace Outer {  namespace Inner {  int value = 10;  }  
}  class OuterClass {  
public:  class InnerClass {  public:  static int value = 20;  };  
};  int main() {  std::cout << Outer::Inner::value << std::endl; // 访问嵌套命名空间中的value  std::cout << OuterClass::InnerClass::value << std::endl; // 访问嵌套类中的静态成员变量  return 0;  
}


总结

作用域限定符::在C++中扮演着至关重要的角色,它使得我们能够精确控制访问的范围,避免命名冲突,并清晰地表达代码的意图。

无论是访问全局变量、命名空间中的成员,还是类的静态成员,::都是不可或缺的。掌握其作用和用法,对于编写清晰、高效、可维护的C++代码至关重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Pandas Series对象创建,属性,索引及运算详解
  • 【系统架构设计师】软件架构的概念(经典习题)
  • 深度学习--------------序列模型
  • 17、Python如何读写文本文件
  • k8s-API 访问控制
  • AMD ThinkSystem服务器上的 Linux 和 C 状态设置 - Lenovo ThinkSystem
  • sqlgun靶场漏洞挖掘
  • 解码未来:H.265与H.266技术对比及EasyCVR视频汇聚平台编码技术优势
  • SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)
  • 【计算机网络】数据链路层深度解析
  • 初写MySQL四张表:(3/4)
  • 编译QT源码时的configure参数须知
  • vue使用TreeSelect设置带所有父级节点的回显
  • k8s多节点集群搭建
  • 【运维】好用的线上项目运维命令
  • ES6指北【2】—— 箭头函数
  • [译]前端离线指南(上)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【node学习】协程
  • css系列之关于字体的事
  • es6
  • export和import的用法总结
  • github从入门到放弃(1)
  • idea + plantuml 画流程图
  • JavaScript 基本功--面试宝典
  • JavaScript设计模式之工厂模式
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Shadow DOM 内部构造及如何构建独立组件
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 简单实现一个textarea自适应高度
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前言-如何学习区块链
  • 首页查询功能的一次实现过程
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 责任链模式的两种实现
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 如何正确理解,内页权重高于首页?
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # Java NIO(一)FileChannel
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #微信小程序:微信小程序常见的配置传值
  • (9)目标检测_SSD的原理
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (差分)胡桃爱原石
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (轉)JSON.stringify 语法实例讲解
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Framework 3.5安装教程
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献