1. C++入门:命名空间及输入输出

C++相比C的变化

  1. 兼容C
  2. 面向对象
  3. 泛型
  4. C的不足的弥补

为什么要有命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的

#include <stdio.h>
#include <stdlib.h>int rand = 0;int main()
{printf("hello world\n");printf("%d\n", rand);return 0;
}

如果有这样一段代码,当不包含stdlib头文件的时候,可以正常运行
但是包含上之后,会显示
![[Pasted image 20240508142432.png|755]]

命名冲突:全局变量rand和库里面的函数rand冲突了
C的一大缺陷是无法解决命名冲突的问题

场景:

  1. 定义的名字跟库冲突
  2. 程序员互相之间会冲突

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

1. 正常定义一个命名空间
#include <stdio.h>
#include <stdlib.h>namespace cho
{int rand = 0;
}int main()
{printf("hello world\n");printf("%d\n", rand);return 0;
}

这样就可以编译通过

用一堵围墙将定义的全局变量rand围起来,默认不会到墙里面去找
访问rand的时候,默认访问是没有被围起来的rand

会有一个警告
![[Pasted image 20240508143814.png|811]]

因为全局的rand是一个函数名,也就是一个函数指针
![[Pasted image 20240508143918.png]]

使用%p打印解决问题,打印的就是rand函数的地址

2. 嵌套定义命名空间

如果命名空间里自己定义的名字和自己冲突了

#include <stdio.h>
#include <stdlib.h>namespace cho
{namespace cho1{int rand = 0;}namespace cho2{int Add(int left, int right){return left + right;}}struct Node{struct Node* next;int val;};
}

访问的时候也是嵌套访问

int main()
{printf("hello world\n");printf("%d\n", cho::cho1::rand);cho::cho2::Add(1, 2);struct bit::Node node;return 0;
}

命名空间的使用

1. 指定命名空间访问变量

::域作用限定符

#include <stdio.h>
#include <stdlib.h>namespace cho
{int rand = 0;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{printf("hello world\n");printf("%d\n", cho::rand);cho::Add(1, 2);struct bit::Node node;return 0;
}

cho::rand:表示访问的是命名空间里的那一个rand,可以访问cho这个命名空间域
函数和结构体同理

2. 展开命名空间访问变量

自己做测试的时候,每次访问变量都要指定命名空间,很麻烦

#include <Stack.h>using namespace cho;using namespace std;int main()
{ST s;StackInit(&s);StackPush(&s, 1);return 0;
}

展开命名空间,把墙拆了
默认也会在cho这个命名空间搜索
展开了一般就不指定了

using namespace std;

展开std命名空间,std是C++官方库定义的命名空间
C++库里面的东西都在std命名空间里面
在工程项目里面不要这样展开,容易冲突
日常练习,为了方便可以展开

展开了多个命名空间,编译器哪个命名空间都会进
会先去全局里面找ST,全局没有会挨着去找,cho里面找到了就不会再找了
cho没有找到会去std里面去找
如果都没有找到会报错

3. 指定展开命名空间访问变量

每次指定命名空间很不方便
直接展开,全部暴露,又有冲突危险

using std::cout;
using std::endl;int main()
{cout << "hello world\n";int a = 10;double b = 11.11;cout << a << endl;cout << b << endl;cout << a << endl << b << endl;return 0;
}

命名空间实际应用

#pragma once
include <stdio.h>namaspace cho
{typedef struct Stack{int* a;int top;int capacity;}ST;void StackInit (ST* ps);void StackPush (ST* ps, int x);
}
#include "Stack.h"namespace cho
{void StackInit (ST* ps){ps->a = NULL;ps->top = 0;ps->capacity = 0;}void StackPush(ST* ps, int x){//...}
}

多个文件的多个位置的同一个命名空间,编译器会把它们合并成一个

#include <Stack.h>int main()
{cho::ST s;cho::StackInit(&s);cho::StackPush(&s, 1);return 0;
}

IO流的基本使用

#include <iostream>int main()
{std::cout << "hello world\n";int a = 10;double b = 11.11;std::cout << a << "\n";std::cout << b << "\n";std::cout << a << "\n" << b << "\n";return 0;
}

<<:流插入运算符
cout在std命名空间里,只有指定了命名空间才可以使用
c - console 暂时理解为控制台/终端
cout可以自动识别输出变量的类型

![[Pasted image 20240508162156.png|191]]

std::cout << a << std::endl << b << std::endl;

endl:换行符
>>:流提取运算符
同样可以自动识别类型

cin >> a >> b;
说明
  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream>头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识

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

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

相关文章

聊聊BitLocker

最近有消息称微软决定在Windows 11 24H2中默认开启BitLocker&#xff0c;这个消息在网上引起了不小的波澜。有人说&#xff0c;对于我们这些普通用户来说&#xff0c;BitLocker真的有必要吗&#xff1f; 什么是BitLocker BitLocker 是一项 Windows 安全功能&#xff0c;可为整…

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF&#xff08;Exchangeable Image File&#xff09;是…

React 之 <Suspense>(十三)

React内置组件 <Suspense> 允许在子组件完成加载前展示后备内容。 和Vue的<Suspense>相似。 使用 React.lazy 和 <Suspense> 的代码示例&#xff1a; // MyComponent.js const MyComponent () > { // ... 你的组件代码 ... return <div>Hello…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

npm安装指定版本,npm删除依赖,卸载依赖

安装指定版本 npm中安装指定的版本号&#xff0c;格式为 ‘包名版本号’ npm install 包名称版本号 --save 例如安装jquery: npm install jquery3.0.0 --save在package.json里面可以看到对应的包&#xff1a; "jquery": "^3.0.0"注意&#xff1a;已有…

软胶囊弹性检测:确保药品质量与患者安全的关键步骤

软胶囊弹性检测&#xff1a;确保药品质量与患者安全的关键步骤 在医药领域&#xff0c;软胶囊作为一种常见的药物载体&#xff0c;其质量的优劣直接关系到药物的有效性和患者的安全。软胶囊的弹性作为其质量评估的重要指标之一&#xff0c;不仅影响其储存和运输的稳定性&#x…

C语言内存泄漏查找

在C语言中查找内存泄漏可能是一个相当复杂的任务,因为C语言不提供像一些高级语言(如Java或C#)那样的内置内存管理或垃圾回收机制。然而,你仍然可以使用一些工具和策略来检测内存泄漏。 1.使用内存检测工具 有很多工具可以帮助你检测C程序中的内存泄漏,例如Valgrind,Dr. M…

AI大模型应用与实践指南

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

虚拟机镜像文件格式qcow2转zst

一、使用qcow2文件还原出pve虚拟机 1.1、在pve上创建一个空的新虚拟机 把虚拟机的网卡和磁盘删除 将外部磁盘镜像为vm中未使用的磁盘。这个镜像格式必须是qemu-img支持的镜像格式(qcow2/raw/vmdk) qm importdisk 101 bigdata-ubuntu-x86.qcow2 local-lvm此时查看pve上虚拟机…

Leetcode167两数之和

题目链接&#xff1a; 167两数之和 解题思路: 缩减空间法 // 167 两数之和 缩减搜索空间方法 vector<int> twoSum(vector<int>& numbers, int target) {int i 0;int j numbers.size() - 1;while (i < j){int tmp numbers[i] numbers[j];if (tmp tar…

3D人体展示仪

网址 https://3dbodyvisualizer.com/ 可以根据身高体重之类的在线生成人体的3D模型&#xff0c;感兴趣的可以试试

Flutter-Statewidget 创建State过程State<XXXX> createState() => _XXXXState()的解释

文章目录 创建widget 的状态对象示例代码解析 完整的代码示例总结 创建widget 的状态对象 今天有个同学问了我下State createState() > _XXXXState()时什么意思。这个代码在flutter开发中一直看到&#xff0c;很多人都不关心这个&#xff0c;直接当模板使用。今天来介绍下这…

2024蓝桥杯CTF writeUP--packet

根据流量分析&#xff0c;我们可以知道129是攻击机&#xff0c;128被留了php后门&#xff0c;129通过get请求来获得数据 129请求ls Respons在这 里面有flag文件 这里请求打开flag文件&#xff0c;并以base64编码流传输回来 获得flag的base64的数据 然后解码 到手

抖音快速涨粉方法揭秘:巨量千川投流助力你快速增粉1000~10万!

在当前热门社交媒体平台中&#xff0c;抖音无疑是备受追捧的。然而&#xff0c;要在抖音上快速涨粉并获得更多关注&#xff0c;是一项具有挑战性的任务。但别担心&#xff01;今天&#xff0c;我们将揭秘全网都在搜索的抖音快速涨1000粉的秘籍&#xff0c;教你如何利用巨量千川…

C++模版(高阶)

目录 非类型模版参数 模板特化 类模板全特化 类模板偏特化 函数模板全特化与偏特化 模板分离编译 非类型模版参数 前面的模版中&#xff0c;使用的都是针对对象类型设计的模版参数&#xff0c;从而便于编译器针对不同类型推演出不同类型的函数或者类 但是有一种模版参数…

返回链表的中间节点题目讲解(超快方法)

一&#xff1a;题目 二&#xff1a;思路讲解 采用快慢指针方法来解决 1&#xff1a;slow指针一次跳一个节点&#xff0c;fast指针一次跳两个节点&#xff0c;这样当fast到尾节点的时候&#xff0c;slow刚好到中间节点&#xff0c;但是奇数个的时候&#xff0c;fast不会刚好的…

Laravel - 数组函数

引入包 use Illuminate\Support\Arr; 一、检查给定的值是否可数组式访问 Arr::accessible([a > 1, b > 2]);// true 二、数组添加 Arr::add([name > Desk], price, 100) ;// [name > Desk, price > 100] Arr::add([name > Desk, price > null], price…

电子元器件商城如何建设

建设一个成功的电子元器件商城需要考虑以下几个方面&#xff1a; 1. 明确目标市场和用户需求 确定目标客户群是个人爱好者、小型企业还是大型制造商&#xff1f;了解目标客户群对电子元器件的需求特点&#xff0c;例如价格、质量、品牌、规格、技术支持等。 2. 选择合适的电…

Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》

Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》 一、参与方式二、作者荐语三、图书简介四、本期推荐图书4.1 前 言4.2 本书内容4.3 本书目的4.4 本书适合的读者4.5 配套源码、PPT课件等资源下载 五、目 录六、&#x1f6d2; 链接直达 Hadoop框架入门书&#xff0c;可当…

async详解

async(1): cpp20协程基础-CSDN博客async(2)concept与辅助类-CSDN博客async(3)句柄、Selector、EventLoop-CSDN博客async(4) 返回值-CSDN博客async(5) 封装-CSDN博客async(6) &#xff08;批量&#xff09;等待-CSDN博客async(7) 网络相关-CSDN博客