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

C++:入门基础

1.命名空间

1.1namespace的价值

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

C语言项目中命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

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

由上图可知:当包含头文件<stdlib.h>时,全局变量rand就会与头文件<stdlib.h>中的rand函数冲突,这是非常令人无语的一件事,C++创始人本贾尼·斯特劳斯特卢普在创建C++中考虑到这一问题并提出了使用namespace来解决这一问题。

1.2namespace的定义
  • 定义命名空间,需要使用到namespace关键字,后面根命名空间的名字,然后再加一对{}即可,其中{}中的信息即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  • namespace本质是定义了一个域,这个域根全局域各自独立,不同的域可以定义同名变量
  • C++中域有函数局部域、全局域、命名空间域、类域;域会影响编译时查找一个变量/函数/类型出处(声明或者定义)的逻辑,所以有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域则不影响变量的生命周期
  • namespace只能在全局定义,不能在函数中定义,但是namespace可以嵌套定义
  • 项目工程中当包括多个同名的namespace是会认为是同一个namespace,不会起冲突
  • C++标准库都放在一个叫std(standard)的命名空间中
#include<iostream>
#include<stdlib.h>
namespace cwy//cwy为命名空间的名字
{//命名空间中可以定义变量/函数/类型// //定义变量randint rand = 5;//定义函数int Add(int x, int y){return x + y;}//定义结构体类型struct Node{struct Node* next;int val;};
}int main()
{printf("%d\n", rand);
}

提示:这里之所以打印结果为1573014864是因为rand的返回值是随机值,我们可以打印出rand的地址。我们还可以看到在执行代码时程序并没有报错,这是因为变量rand被namespace域封住了,这里的rand是全局的rand函数指针。如果想要打印变量rand可以在rand前面加上cwy::(即cwy::rand)代表在cwy这个命名空间域中查找变量rand。代码如下:

namespace cwy//cwy为命名空间的名字
{//命名空间中可以定义变量/函数/类型// //定义变量randint rand = 5;//定义函数int Add(int x, int y){return x + y;}//定义结构体类型struct Node{struct Node* next;int val;};
}int main()
{//这里的rand是全局的rand函数指针printf("%d\n", rand);//这里的rand是指定cwy命名空间中的randprintf("%d\n", cwy::rand);return 0;
}

1.3namespace的嵌套
//namespace的嵌套
namespace cwy
{namespace hello{int rand = 5;int Add(int x, int y){return x + y;}}namespace world{int rand = 5;int Add(int x, int y){return x + y;}}
}int main()
{printf("%d\n", cwy::hello::rand);printf("%d\n", cwy::world::rand);printf("%d\n", cwy::hello::Add(1, 2));printf("%d\n", cwy::world::Add(1, 2));return 0;
}

微提示:不同的域可以定义同名变量,所以上面代码中hello域和world域中的rand不存在冲突,及时嵌套了多层namespace命名空间,但是使用规则还是一样,想要使用域中的变量就在变量前面加上域名和俩个冒号(即域名::),其中(::)代表的是域作用限定符

由上图可知,namespace只可以在全局定义

1.4命名空间的使用

编译查找一个变量是声明/定义时,默认只会在局部或者全局查找,不会到命名空间里去查找。所以我们要使用命名空间中定义的变量/函数/类型由三种方法:

  • 指定命名空间访问,项目中推荐这种方式
  • 使用using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式
  • 展开命名空间中全部成员,项目不推荐,因为风险很大,日常小练习程序为了方便推荐使用
#include<stdio.h>namespace cwy
{int a = 0;int b = 1;
}int main()
{//“a”: 未声明的标识符	printf("%d\n", a);return 0;
}

微提示:这里的报错原因我们在上面也提到过,编译查找一个变量是声明/定义时,默认只会在局部或者全局查找,不会到命名空间里去查找,所以会报错,下面我们将提及3中访问方式

一:指定命名空间访问

namespace cwy
{int a = 0;int b = 1;
}int main()
{//指定命名空间访问printf("%d\n",cwy:: a);return 0;
}

指定命名空间访问的方式是比较推荐的

二:使用using将命名空间中某个成员展开

namespace cwy
{int a = 0;int b = 1;
}//使用using将命名空间中某个成员展开
using cwy::b;
int main()
{printf("%d\n", cwy::a);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);return 0;
}

微提示:使用using将命名空间中某个成员展开对于那些需要经常访问的成员特别方便,使用是只需使用using再加上域名,域作用限定符和访问的成员名即可(即 using cwy::b;)

三:展开命名空间中全部成员

namespace cwy
{int a = 0;int b = 1;
}//展开命名空间中全部成员
using namespace cwy;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

微提示:展开命名空间中全部成员的方式我们不推荐使用特别是在大项目中,因为当命名空间中的成员很多时,需要展开的成员就特别多,每一条需要的语句都展开一次那么代价是特别大的,程序效率会降低,风险很大,所以我们在日常练习中可以使用但是在项目中不推荐使用。

2.C++输入和输出

  • <iostream>是Input  Output  Stream 的缩写,是标准的输入、输出流库,定义了标准的输输出对象。
  • std::cin是istream类的对象,它主要面向窄字符的标准输入流。
  • std::cout是outsream类的对象,它主要面向窄字符的标准输出流。
  • std::endl是一个函数,流插入输出时,相当于一个换行字符加刷新缓冲区。
  • <<是流插入运算符,>>流提取运算符(C语言还用这两个运算符做位运算左移/右移)。
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。
  • 一般日常练习中我们可以包含using namespace std就可以使用输入输出流 ,实际项目开发中 不建议使用using namespace std。
  • 在包含头文件<iostream>的文件中可以不用包含<stdio.h>也可以使用printf和scanf,这是因为头文件<iostream>间接包含了<stdio.h>。
#include<iostream>
using namespace std;int main()
{int a = 0;double b = 1.1;char c = 'x';cout << a << " " << b << " " << c << endl;return 0;
}

微提示:在main函数定义了是三个变量,整形a,浮点型b,字符型c。

分别将整形a,空格,浮点型b,空格,字符型c插入到显示台中(即cout中),endl(end line)表示换行的意思,相当于C语言中的“\n”,'\n'。

特别需要注意的是C++不需要手动输入指定格式就可以自动识别并输出了

#include<iostream>
using namespace std;int main()
{int a = 0;double b = 1.1;char c = 'x';cout << a << " " << b << " " << c << endl;//输入cin >> a >>b >>c;//输出cout << a << " " << b << " "  << c << endl;return 0;
}

3.缺省参数

  • 缺省参数(默认函数)是声明或者定义函数时为函数参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否者使用指定的实参,缺省参数分为全缺省和半缺省函数。
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右向左依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调用,C++规定必须从左向右依次给实参,不能跳跃给实参。
  • 函数声明和定义分离时,缺省参数不能再函数声明和定义中同时出现,规定必须函数声明给缺省值。
#include<iostream>
using namespace std;void func(int a = 5)
{cout << a << endl;
}int main()
{func();//没有给实参时,使用默认值func(10);//传参时,使用指定的实参return 0;
}

微提示:在main函数中调用了两次func函数,第一次调用没有传参,所以使用默认值;第二次调用时传了实参10,所以使用实参10。

#include<iostream>
using namespace std;//全缺省
void func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a <<  endl;cout << "b = " << b << endl;cout << "c = " << c << endl;printf("\n");
}int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);return 0;
}

微提示:func1函数共定义了3个形参并且3个形参都给了默认值,所以func1为全缺省函数,在main函数中共调用了func1函数4次,第一个func1函数1个实参都没有传,所以都打印默认值;第二个func1函数给了1个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,所以第一打印实参,第二个和第三个使用默认值;第三个func1函数给了2个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,实参给了第一第二个形参,所以第一个、第二个打印实参,第三个使用默认值;第四个func1函数给了3个实参,全部都使用实参值。

#include<iostream>
using namespace std;//半缺省
void func2(int a , int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl <<endl;}int main()
{func2(100);func2(100, 200);func2(100, 200, 300);return 0;
}

微提示:func2函数共定义了3个形参并且第一个形参没有给形参,后面两个都给了默认值,所以func2为半缺省函数,在main函数中共调用了func2函数3次;第一个func2函数给了1个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,所以第一打印实参,第二个和第三个使用默认值;第二个func2函数给了2个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,实参给了第一第二个形参,所以第一个、第二个打印实参,第三个使用默认值;第三个func2函数给了3个实参,全部都使用实参值。

相关文章:

C++:入门基础

1.命名空间 1.1namespace的价值 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称都将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;避免命名冲突或者名字…...

微信小游戏 彩色试管 倒水游戏 逻辑 (二)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义一个 Water class 1. **定义接口和枚举**&#xff1a; - WaterInfo 接口定义了水的颜色、高度等信息。 - PourAction 枚举定义了水的倒动状态&#xff0c;…...

【链表】算法题(一) ---- 力扣 / 牛客

一、移除链表元素 移除链表中值为val的元素&#xff0c;并返回新的头节点 思路&#xff1a; 题目上这样说&#xff0c;我们就可以创建一个新的链表&#xff0c;将值不为val的节点&#xff0c;尾插到新的链表当中&#xff0c;最后返回新链表的头节点。 typedef struct ListNo…...

Linux系统之部署盖楼小游戏

Linux系统之部署盖楼小游戏 一、小游戏介绍1.1 小游戏简介1.2 小游戏玩法基本介绍1.3 项目预览二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 版本要求三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本四、安装node.js4.1 安装nvm4.2 查看nvm版本4.3 安装…...

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现&#xff0c;能换的话&#xff0c;当且仅当.和1在一个环里&#xff0c;而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置&#xff0c;然后判断.和1在不在一个环里 也就是&#xff1a; 1. 判断删掉1时&#xff0c;.和(x,y)联…...

【机器翻译】基于术语词典干预的机器翻译挑战赛

文章目录 一、赛题链接二、安装库1.spacy2.torch_text 三、数据预处理赛题数据类定义 TranslationDataset批量处理函数 collate_fn 四、编码器和解码器Encoder 类Decoder 类Seq2Seq 类注意事项 五、主函数1. load_terminology_dictionary(dict_file)2. train(model, iterator, …...

推荐系统:从协同过滤到深度学习

目录 一、协同过滤&#xff08;Collaborative Filtering, CF&#xff09;1. 基于用户的协同过滤2. 基于物品的协同过滤 二、深度学习在推荐系统中的应用1. 深度学习模型的优势2. 深度学习在推荐系统中的应用实例 三、总结与展望 推荐系统是现代信息处理和传播中不可或缺的技术&…...

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用&#xff0c;可能是由于以下原因导致&#xff1a; 恶意攻击&#xff1a;攻击者利用自动化脚本或工具对接口进行大量请求&#xff0c;以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误&#xff1a;某些情…...

SpringBoot 解决 getSession().getAttribute() 在负载均衡环境下无法获取session的问题

在Spring Boot中&#xff0c;使用getSession().getAttribute()方法时遇到在负载均衡环境下无法正确获取session属性的问题&#xff0c;通常是由于session属性存储在单个服务器的内存中&#xff0c;而负载均衡会导致用户的请求被分配到不同的服务器上&#xff0c;因此无法找到在…...

Jmeter常用组件及执行顺序

一 常用组件 1.线程组 Thread Group 线程组是一系列线程的集合&#xff0c;每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中&#xff0c;每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中&#xff0c;线程组组件运行用户设置线程数量、初始化方式等…...

PTrade常见问题系列10

get_ashares获取list为空。 get_Ashares函数目前都是向行情服务器进行获取的 如果请求数过多&#xff0c;应答返回偶现为空现象&#xff0c; 后续版本内进行优化从服务器缓存内取&#xff0c;需求单号&#xff1a;202303213922&#xff0c;于PTradeQT1.0V202202.01.023内发布…...

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时&#xff0c;从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样&#xff0c;第一个字符不匹配时&#xff0c;只能匹配下一个子串&#xff0c;因此&#xff0c;往后&#xff0c;next[1]都无脑写…...

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…...

android studio 怎么下载 buildTool

在Android Studio中下载Build Tools&#xff0c;通常可以通过Android Studio内置的SDK Manager来完成。以下是详细的步骤&#xff1a; 一、通过Android Studio的SDK Manager下载Build Tools 启动Android Studio&#xff1a;首先&#xff0c;确保你已经安装了Android Studio&am…...

copy 和 mutableCopy 有点乱

字符串的拷贝操作 对 string literal (字符串字面量) 执行 copy 要打印指针指向对象的地址和指针本身的地址&#xff0c;可以使用 %p 格式符来输出指针地址。以下代码&#xff0c;展示了 originalString 和 copiedString 的指针地址和指向对象的地址&#xff1a; NSString *…...

sqlalchemy通过查询参数生成query

sqlalchemy通过查询参数生成query 在SQLAlchemy中,可以使用查询参数来动态生成查询。这通常通过使用.filter()方法和Python的比较运算符来实现。以下是一个简单的示例,展示如何使用查询参数生成查询: 假设我们有一个名为User的模型(表),它具有id、username和email字段。…...

【JavaScript 算法】二分查找:快速定位目标元素

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于在有序数组中快速定位目标元素。相比于线性查找&#xff0c;二分查找…...

论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer

目录 摘要 介绍 方法 VIT-V-Net体系结构 损失函数 图像相似性度量 变形场正则化 结果与讨论 摘要 在过去的十年里&#xff0c;卷积神经网络(ConvNets)在各种医学成像应用中占据了主导地位并取得了最先进的性能。然而&#xff0c;由于缺乏对图像中远程空间关系的理解&a…...

C++入门到进阶(图文详解,持续更新中)

C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 详解C入门知识到进阶&#xff0c;配合图观看易于理解记录 文章目录 目录 C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 文章目录 前言 一、数据 &#xff08;一&#xff09;数据类…...

【React Hooks原理 - useRef】

概述 在Function Component项目中当我们需要操作dom的时候&#xff0c;第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已&#xff0c;为了更好的学习React Hooks内部实现原理&#xff0c;知其所以然。所以本文根据源码从useRef的基础使用场景一…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...