『C/C++养成计划』C++中的双冒号::名解析(Scope Resolution Operator)

news2024/9/27 21:29:40
C++中的双冒号::名解析(Scope Resolution Operator)!

文章目录

  • 1. 访问命名空间中的成员
  • 2. 访问类中的静态成员
  • 3. 嵌套类访问
  • 4. 在类之外定义函数
  • 5. 当存在具有相同名称的局部变量时,要访问全局变量
  • 6. C++模板参数的自动推导
  • 参考文献

  • C++中的双冒号名解析(Scope Resolution Operator),也称作作用域运算符,用于指明一个标识符的作用域。双冒号一般用于以下几种情况:

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

  • 在C++中,命名空间是将全局作用域分隔为更小的区域,以避免命名冲突的一种机制。可以使用双冒号来访问命名空间中的成员,例如:
namespace ns {
    int a;
    void foo() {}
}

int main() {
    ns::a = 1;  // 使用双冒号访问命名空间中的 a
    ns::foo();  // 使用双冒号访问命名空间中的 foo 函数
}

2. 访问类中的静态成员

  • 在 C++ 中,可以使用类名和双冒号来访问类中的静态成员,例如:
// C++ program to show that :: can be used to access static 
// members when there is a local variable with same name 
#include<iostream> 
using namespace std; 
 
class Test 
{ 
    static int x;   
public: 
    static int y;    
 
    // Local parameter 'a' hides class member 
    // 'a', but we can access it using :: 
    void func(int x)   
    {  
       // We can access class's static variable 
       // even if there is a local variable 
       cout << "Value of static x is " << Test::x; 
 
       cout << "\nValue of local x is " << x;   
    } 
}; 
 
// In C++, static members must be explicitly defined  
// like this 
int Test::x = 1; 
int Test::y = 2; 
 
int main() 
{ 
    Test obj; 
    int x = 3 ; 
    obj.func(x); 
 
    cout << "\nTest::y = " << Test::y; 
 
    return 0; 
} 

3. 嵌套类访问

  • 如果另一个类中存在一个类,我们可以使用嵌套类使用作用域运算符来引用嵌套的类,例如:
// Use of scope resolution class inside another class.
#include <iostream>
using namespace std;

class outside {
public:
    int x;
    class inside {
    public:
        int x;
        static int y;
        int foo();
    };
};
int outside::inside::y = 5;

int main() {
    outside A;
    outside::inside B;
}
  • 下面这种情况和下面std::vector<int>::iterator的情况一样。
// Use of scope resolution class inside another class.
#include <iostream>
using namespace std;

class A {
public:
    A() { cout << "constructor" << endl; }
};

class B {
public:
    typedef A B_A;
};

int main(int argc, char const *argv[]) {
    B::B_A a;
    return 0;
}
// constructor
  • c++中的标准库vector中,std::vector<int>::iterator it; 给出解释:在这个例子中,std是标准命名空间,vector是std中的一个类,int是vector类的模板参数之一,iterator是vector类中的一个类型定义(type definition)。因此,std::vector::iterator表示vector类的迭代器类型,它的别名为iterator。
  • 也就是说:当一个类内部定义了一个嵌套类型(nested type),比如 std::vector 内部定义了 iterator 类型,我们可以使用 :: 来访问这个类型。
  • 源码中iterator是这样定义的,typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;这里的 __gnu_cxx::__normal_iterator 实际上是一个迭代器类,用于在容器中遍历元素。pointer 表示指向元素的指针类型,而 vector 则表示容器类型。
  • typedef 是 C++ 中的一个关键字,用于给一个已有的数据类型起一个新的名称。它的作用是让程序员可以用一个简短、易懂的名字来代替一个复杂、冗长的数据类型名称,从而提高程序的可读性和可维护性。
# typedef <原类型> <新类型名>;
typedef int myInt;
myInt a = 5;
  • 在 C++11 标准中,也可以使用 using 来定义类型别名,如下,这样定义的效果与上述 typedef 的效果相同。
using myInt = int;
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int>::iterator it = vec.begin(); // 使用 :: 访问嵌套类型 iterator
    std::cout << *it << std::endl; // 输出 1
    return 0;
}

4. 在类之外定义函数

// C++ program to show that scope resolution operator :: is used 
// to define a function outside a class 
#include<iostream>  
using namespace std; 
 
class A  
{ 
public:  
 
   // Only declaration 
   void fun(); 
}; 
 
// Definition outside class using :: 
void A::fun() 
{ 
   cout << "fun() called"; 
} 
 
int main() 
{ 
   A a; 
   a.fun(); 
   return 0; 
} 

5. 当存在具有相同名称的局部变量时,要访问全局变量

// C++ program to show that we can access a global variable 
// using scope resolution operator :: when there is a local  
// variable with same name  
#include<iostream>  
using namespace std; 
 
int x;  // Global x 
 
int main() 
{ 
  int x = 10; // Local x 
  cout << "Value of global x is " << ::x; 
  cout << "\nValue of local x is " << x;   
  return 0; 
} 

6. C++模板参数的自动推导

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

参考文献

  • https://zhuanlan.zhihu.com/p/137383328
  • https://www.jianshu.com/p/75968bf24fe7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外贸人如何写出优秀的开发信?附详细思路

如何写出优秀的开发信&#xff1f;最近做出口生意的客户都在抱怨&#xff0c;开发信的回复率越来越低&#xff0c;其实原因有很多&#xff0c;有时候并非自己的能力实在很欠缺。原因总结如图&#xff1a;第一&#xff1a;市场不景气这个就是就属于客观因素了&#xff0c;这也许…

InstructGPT论文笔记

论文链接&#xff1a;https://arxiv.org/pdf/2203.02155.pdf 1 摘要 做的事&#xff1a; 1、标注了数据&#xff0c;问题和答案写出来&#xff0c;然后训练模型 2、收集数据集&#xff0c;排序模型的输出&#xff0c;使用强化学习训练这个排序的过程 效果层面来说&#xff1…

思迅软件端口不通导致软件和软锁报错的问题

一、端口不通导致软件和软锁报错的问题 问题说明&#xff1a;打开软件提示到&#xff1a;xxx.xxx.xxx.xxx失败&#xff01; 处理步骤1&#xff1a; 假设软锁服务器IP为192.168.0.1&#xff0c;分别在服务器本机和客户端电脑测试软锁服务: 在服务器的浏览器中访问地址: http:/…

ChatGPT(GPT3.5) OpenAI官方API正式发布

OpenAI社区今天凌晨4点多发送的邮件&#xff0c;介绍了ChatGPT官方API的发布。官方介绍文档地址为“OpenAI API”和“OpenAI API”。 ChatGPT(GPT3.5)官方API模型名称为“gpt-3.5-turbo”和“gpt-3.5-turbo-0301”。API调用价格比GPT text-davinci-003模型便宜10倍。调用费用为…

补档:红黑树代码实现+简略讲解

红黑树讲解和实现1 红黑树介绍1.1 红黑树特性1.2 红黑树的插入1.3 红黑树的删除2 完整代码实现2.1 rtbtree.h头文件2.2 main.c源文件1 红黑树介绍 红黑树( Red-Black tree&#xff0c;简称RB树)是一种自平衡二叉查找树&#xff0c;是计算机科学中常见的一种数据结构&#xff0c…

python画直方图,刻画数据分布

先展示效果 准备一维数据 n 个数据元素计算最大值&#xff0c;最小值、均值、标准差、以及直方图分组 import numpy as np data list() for i in range(640):data.append(np.random.normal(1)) print(data)z np.histogram(data, bins64) print(list(z[0])) ### 对应 x 轴数据…

【C语言】LeetCode 27. 移除元素 的n种解法

文章目录题目描述解法一 快慢下标解法二 数组移位题目描述 OJ链接&#xff1a;27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(…

帮助100w人成功入职的软件测试面试常见问题以及答案

测试面试题怎么来设计测试方案根据测试需求&#xff08;包括功能需求和非功能性需求&#xff09;&#xff0c;识别测试要点&#xff0c;识别测试环境要求&#xff0c;安排测试轮次&#xff0c;根据项目计划和开发计划做整体的测试安排。被测试的特性&#xff1a;通过对需求规格…

MyBatis - 10 - 处理多对一映射关系 + MyBatis延时加载

文章目录1.准备工作1.1 建表1.2 创建Maven项目1.2.1 在pom文件中&#xff0c;修改打包方式为jar包&#xff0c;导入依赖1.2.2 创建日志配置文件和jdbc.properties1.2.3 创建Mybatis核心配置文件1.2.4 创建实体类以及实体类之间的关系1.2.5 创建SqlSession工具类2.为什么要单独处…

Ubuntu配置静态IP的方法

Ubuntu配置静态IP的方法前言一、查看虚机分配的网卡IP二、查看网卡的网关IP三、配置静态IP1.配置IPv4地址2.执行netplan apply使改动生效3.配置的网卡未生效&#xff0c;修改50-cloud-init.yaml文件解决4.测试vlan网络通信总结前言 Ubuntu18.04 欧拉环境 vlan网络支持ipv6场景…

树状数组讲解

树状数组 文章目录树状数组引入例题AcWing241.楼兰图腾思路代码AcWing 242. 一个简单的整数问题思路代码AcWing 244. 谜一样的牛思路代码总结引入 树状数组主要维护的是这样一个数据结构&#xff1a; tr[x]表示以x为终点的长度为lowbit(x)的前缀和 对于树状数组主要就两种操作 …

机器学习系统架构的10个要素

这是一个AI赋能的时代&#xff0c;而机器学习则是实现AI的一种重要技术手段。那么&#xff0c;是否存在一个通用的通用的机器学习系统架构呢&#xff1f;在老码农的认知范围内&#xff0c;Anything is nothing&#xff0c;对系统架构而言尤其如此。但是&#xff0c;如果适用于大…

风力发电机组浪涌保护器安全防护方案

风机的庞大与危险高空作业注定了其在基建和维护中不易操作&#xff0c;风机设备的主电源、过程控制、网络与通讯、现场设备需要高等级的防雷浪涌保护器冲击保护&#xff0c;提高系统及设备的可靠性和可用性。风电场的主要发电设备风力发电机组“大风车”是风电场的主要发电设备…

【数据分析】缺失数据如何处理?pandas

本文目录1. 基础概念1.1. 缺失值分类1.2. 缺失值处理方法2. 缺失观测及其类型2.1. 了解缺失信息2.2. 三种缺失符号2.3. Nullable类型与NA符号2.4. NA的特性2.5. convert_dtypes方法3. 缺失数据的运算与分组 3.1. 加号与乘号规则3.2. groupby方法中的缺失值4. 填充与剔除4.1. fi…

什么是让ChatGPT爆火的大语言模型(LLM)

什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用&#xff1f;大型语言模型如何工作&#xff1f;大型语言模型的热门应用在哪里可以找到大型语言…

王道操作系统课代表 - 考研计算机 第一章 计算机概述 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “计算机概述” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全…

(五十七)插入数据时到底是如何维护好不同索引的B+树的?

之前我们已经给大家彻底分析清楚了MySQL数据库的索引结构了&#xff0c;大家都知道不同索引的结构是如何的&#xff0c;大致是如何建立的&#xff0c;然后搜索的时候是如何根据不同的索引去查找数据的。 那么今天我们来给大家彻底讲清楚&#xff0c;你在插入数据的时候&#x…

JavaSE学习笔记day17

零、 复习昨日 File: 通过路径代表一个文件或目录 方法: 创建型,查找类,判断类,其他 IO 输入& 输出字节&字符 try-catch代码 一、作业 给定路径删除该文件夹 public static void main(String[] args) {deleteDir(new File("E:\\A"));}// 删除文件夹public s…

openjdk:8镜像中安装工具命令的方法

文章目录前言一、获取openjdk:8环境1.下载并运行openjdk:82.获取当前镜像的基础环境信息3.更换源并安装软件二、更新Dockerfile1.增加命令2.尝试构建3.测试镜像是否可用总结前言 记录一下openjdk:8镜像安装命令的方法 同事使用openjdk:8作为基础镜像构建业务镜像&#xff0c;但…

蚂蚁CTO线五年测试开发,年后被优化,跟大家唠几句

夙兴夜寐&#xff0c;回顾从毕业出来到现在的这五年&#xff0c;也是在这里给大家抛砖引玉了。先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入蚂蚁金服&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一…