第1章、C++基础

news2025/1/19 14:37:00

第1章、C++基础

1.1 命名空间

1.1.1 命名空间的含义

在使用C++进行大规模程序设计时,开发过程往往是团队合作,各个程序员命名和各种C++库,对标识符的命名可能发生冲突,从而引进命名空间(一种特殊的域)的概念,以避免命名冲突或名字污染。
【例 1-1】命名冲突

// test1.cpp
#include <iostream>
using namespace std;
int a = 1;
int main()
{
	cout << a << endl;
	return 0;
}
// test2.cpp
int a = 2;

在这里插入图片描述
在这里插入图片描述
这个程序有test1.cpp和test2.cpp组成,两个文件中同时定义了全局变量 a ,引发命名冲突,故而 a 重定义;

1.1.2 命名空间的定义

C++中,命名空间使用namespace关键字声明,是一种特殊的域。

namespace 命名空间标识符名
{
	申明成员;// 可以是变量、函数、类、对象、结构体等
}

【例1-2】命名空间的定义

namespace Gredot1
{
	int a;
	namespace Gredot2
	{
		int b;
	}
}

从这个例子,我们可以看出,命名空间可以嵌套定义,即命名空间嵌套命名空间。在调用时,需要一步一步指定命名空间域。如果命名空间中找不到对应变量名,将会报错。

// 调用变量 b
Gredot1 :: Gredot2 :: b = 10;

这里" : : ",是作用域限定符,用来指定标识符的作用域。

1.1.3命名空间的使用

  • 直接指定标识符命名空间
Gredot1 :: a; 
  • 使用using namespace命令
using namespace Gredot1;
...
{
	a = 10;
}

这种方式是将命名空间完全展开,违背了命名空间设计的初衷,展开有风险,在大型项目中尽量避免使用这种方式。

  • 使用using 关键字
using Gredot :: a;
...
{
	a = 10;
}

注:同名命名空间

// test1.cpp
#include <iostream>
namespace Gredot1
{
	int a;
}
// test2.cpp
namespace Gredot1
{
	int b;
}

在这里插入图片描述
同一个工程允许存在多个相同名称的命名空间,编译器最后合并成一个命名空间(集合思想)
在这里插入图片描述
命名空间的展开和头文件展开的区别:

命名空间展开是指程序编译是是否会到命名空间搜索标识符
头文件展开会将头文件中的内容拷贝到程序代码中

1.2.C++的输入和输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
 cout<<"Hello world!!!"<<endl;
 return 0;
}

说明:

  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  • <<是流插入运算符,>>是流提取运算符。

为了兼容C语言C++的输入输出会对C语言的缓冲区进行同步(检查C语言输入缓冲区),所以cin/cout速度会慢于scanf/printf。

1.3 缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

缺省值只能是常量或全局变量。

1、全缺省参数

void func(int a = 5, int b = 6, int c = 9)
{
	cout << a<< b << c << endl;
}
int main()
{
	func(1,2,3);//a接收1,b接收2,c接收3
	func(1,2);//a接收1,b接收2,c使用缺省值9
    fun();//a使用缺省值5,b使用缺省值6,c使用缺省值9
	return 0;
}

全缺省参数在调用时,不给参数时,将会使用缺省值调用。调用时,实参和形参从左到右匹配。

2、半缺省参数

void func(int a , int b = 6, int c = 9)
{
	cout << a << b << c << endl;
}
int main()
{
	func(1, 2, 3);//a接收1,b接收2,c接收3
	func(1);//a接收1,b使用缺省值6,c使用缺省值9
	func();//错误写法,因为形参a不是缺省,至少传一个参数
	return 0;
}

未使用缺省值的形参,在传参时必须传入,有缺省值的形参,根据需要可传可不传。

1、缺省必须从右往左缺省,不能a变量给了缺省值,b没给,c给了,这种跳跃的缺省语法是不被允许的。

2、缺省参数不能在函数声明和定义中同时出现,在声明中给了缺省值,定义中就不要给缺省值了!

1.4 函数重载

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明多个同名函数,这些同名函数参数类型、参数个数、类型的顺序不同,常用来处理实现功能类似数据类型不同的问题。

1.4.1 什么情况可以重载

  • 函数参数个数不同 && 函数名相同
  • 函数参数类型不同 && 函数名相同
  • 函数参数顺序不同 && 函数名相同

1.4.2 函数重载原理

命名修饰规则(Linux演示)
在这里插入图片描述在这里插入图片描述在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中,所以就能根据形参,来区分同名函数。g++编译器函数名修饰规则【_Z+函数长度 +函数名+类型首字母】

问:为不能用函数返回值作为重载的标志?
答:因为就算函数名修饰规则中有函数返回类型的区分,我们在调用函数传参的时候,编译器是没办法知道我们想要调用哪个函数,会产生二义性。

1.5 引用

引用,就是已定义变量的一个别名。可以给变量取别名,也可以给变量的别名取别名,编译器不会为引用额外开辟空间,他们都代表着同一块空间。取的别名的类型必须与原变量保持一致。

1.5.1 引用特性

  • 引用在定义的时候必须初始化
int a = 10;
int&ra; // 未初始化的引用,错误写法
  • 一个变量可以有多个引用
int a = 10;
int&b = a;
int&c = b;
// b c都是a的别名
// 将相当于外号
  • C++ 引用不能改变指向
int a = 10;
int&b = a;
int x = 20;
b = x;  // 赋值操作,而非改变引用指向 

1.5.2 常引用(指针和引用的赋值,权限可以缩小不能扩大)

  • 对常量的引用
int main()
{
   const int& a = 10; // 用常引用作常量的别名
   return 0;
}

10是常量,有“常属性”,可读不可写,如果不加const修饰,那么a的权限就变成了可读可写,这是权限的放大,语法是不通过的,所以这里的a必须加上const修饰。(右往左)

  • 对const常量的引用
int main()
{
	const int a = 10;
	const int& ra = a;// 权限平移
	return 0;
}
  • 隐式、强制类型转换的引用
int main()
{
	double a = 10.256;
	const int& ra = a;// 权限平移  ra打印结果是10
	return 0;
}

变量a发生隐式类型转换,a将自身的数值截断后复制到临时变量中,ra对临时变量进行引用。临时变量具有常属性。所以这里要加const修饰。

1.5.3传参时的权限问题

  1. 权限只可以平移或缩小,不能放大。【右 - > 左】

2、缺省引用,必须使用const修饰
在这里插入图片描述
3、const提升生命周期
值作为返回值时,由于临时变量出作用域销毁,此时会产生临时变量返回,引用作为函数返回值时,不会产生临时变量;
在这里插入图片描述
fun函数的返回值使用临时变量带回,ret作为临时变量的引用,加const会延长临时变量的生命周期;
3、引用的使用场景

1.5.4 引用做参数

void Swap(int& a, int& b)
{
	int tmp=a;
	a = b;
	b = a;
}

引用作为函数的形参,函数将直接操作a,b变量本身,而不会产生拷贝

引用做参数的优势

  • 减少拷贝,提高效率

  • 作为输出型参数,在函数中,形参改变会改变实参。

  • 一般引用做参数的(函数中形参不需要改变)都要用const引用

1.5.5引用做返回值

错误用法:

int& Add(int a, int b)
{
	int sum = a + b;
	return sum;  // sum 为局部变量
}
int main()
{
	int ret = Add(1, 2);
	cout << ret << endl;
	return 0;
}

当Add函数调用完毕后,函数栈帧被销毁,同时通过临时变量将sum的别名返回,但是sum它已经被销毁了。所以这是一种错误的用法。

正确用法:

int& Add(int a, int b)
{
	static int sum = a + b;
	return sum;   // sum 为全局变量
}
int main()
{
	int ret = Add(1, 2);
	cout << ret << endl;
	return 0;
}

总结:函数栈帧结束后,如果返回值不会随着栈帧的结束而销毁,那么就可以使用引用返回。

引用返回相较于传值返回的优势
1、减少拷贝,提高运行效率

2、可以直接对返回值进行修改

1.5.6 引用和指针的区别

1、语法上引用是变量的别名,不开空间,而指针存储一个变量地址。但是引用的底层是用指针实现的。

2、引用在定义时必须初始化,指针没有要求

3、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 。这就导致了C++的引用代替了一部分指针的功能,但不能完全代替。例如链表中的next必须用指针实现。如果采用引用的方式引用节点,插入删除节点要修改next,没办法通过引用改变next指向的值。

4、没有NULL引用,但有NULL指针

5、在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32

位平台下占4个字节)

6、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7、有多级指针,但是没有多级引用

8、访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9、引用比指针使用起来相对更安全

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

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

相关文章

MIPI D-PHYv2.5笔记(19) -- Fault Detection

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 检测链路的故障有三种不同的机制。总线冲突&#xff…

10.1 二重积分的概念与性质

学习目标&#xff1a; 学习二重积分&#xff0c;我会采取以下几个步骤&#xff1a; 了解基本概念&#xff1a;首先我会学习二重积分的定义及其意义&#xff0c;了解二重积分的性质和特点&#xff0c;以及二重积分的计算方法。 理解二重积分的几何意义&#xff1a;我会通过画图…

Window10 源码编译UE4-27

Window10 源码编译UE4-27 文章目录 Window10 源码编译UE4-27一、查看官方软件软件环境配置&#xff08;[https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/VisualStudioSetup/](https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/…

编写高质量代码:改善Java程序的151个建议(数组和集合)

集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序&#xff0c;compareTo方法是Comparable接口要求必须实现的&#xff0c;它与equals方法有关系吗?有关系&#xff0c;在compareTo的返回为0时&#xff0c;它表示的是 进行比较的两个元素时相等…

SRv6项目实践(三):P4Runtime基础以及交换机控制

在正式介绍P4runtime基础之前&#xff0c;先说一说P4的编译和实现的过程 bmv2.json&#xff1a;p4文件经过编译器编译以后会生成bmv2.json文件&#xff0c;此文件以JSON格式定义BMv2 simple_switch目标的配置。当simple_switch接收到新的数据包时&#xff0c;它使用此配置以与…

24.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 &#xff08;1&#xff09;设置服务器启动的展示页面。 &#xff08;2&#xff09;创建工程步骤。 &#xff08;3&#xff09;applicationContext.xml配置文件。 &#xff08;4&#xff09;spring-mvc.xml配置文件。 &#xff08;5&…

新建论文三线表模板,一键格式刷

论文三线表模板 写在最前面①表设计&#xff0c;新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤 写在最前面 论文写完啦&#xff0c;准备调整格式 之前建模也是三线表&#xff0c;但只能基于该文档模板&#xff0c;所以重新设置一下。 …

linux speedtest-cli工具测试网络带宽、测试网速(下载速度、上传速度和延迟等信息)

speedtest-cli是一个命令行工具&#xff0c;用于测试网络的带宽。它可以在Linux、macOS和Windows等操作系统上运行。下面是使用speedtest-cli测试网络带宽的步骤&#xff1a; 安装speedtest-cli。在Linux系统上&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get in…

cookies 和 Session

并且注意 meta complete改为“false”,不然不支持Servlet注解 Session会话 会话&#xff1a;用户打开一个浏览器&#xff0c;点击了很多超链接&#xff0c;访问了 有状态会话&#xff1a;一个同学曾今来过教室&#xff0c;下次再来教室&#xff0c;我们会知道这个同学&#…

verdaccio搭建npm私服

1 安装依赖 npm install verdaccio -g开机自启 npm install pm2 -g2启动服务 pm2 start verdaccio 进入页面 http://localhost:4873/ 其他 修改 config.yaml 源为淘宝源 uplinks:npmjs:url: https://registry.npm.taobao.org/

【花雕学AI】真是太多了:汇总国内免费在线使用ChatGPT的完整镜像站列表大全(1000+)

一、ChatGPT为什么火爆&#xff1f; 它是一个可以和你聊天的人工智能程序&#xff0c;它可以用文字回答你的问题&#xff0c;也可以根据你的提示写出文章、歌词、代码等内容。ChatGPT是由一个叫OpenAI的机构开发的&#xff0c;它使用了一种叫做GPT的技术&#xff0c;这种技术可…

[Android+JetPack] (Java实现) Retrofit2+RxJava3+Paging3+RecyclerView 实现加载网络数据例子 记录

文章目录 前言参考链接依赖库及版本Demo效果接口及数据展示各项模块Retrofit2Bean,对应上面的接口返回.Service API部分 Paging3PagingSource以及 RxPagingSourcePagingDataAdapter 适配器ViewModelPublicInfoPage /Activity 最后 前言 继续安卓学习之旅,本章的主要目标是: 1.完…

2023年mathorcup杯A题代码小技巧总结

写篇杂文&#xff0c;不属于我的任何一个栏目&#xff0c;没啥案例含义&#xff0c;主要是记录一下mathorcup杯期间写的代码技巧。 mathorcup杯大部分都是组合优化问题&#xff0c;这让我擅长的机器学习都深度学习毫无作用....... 还好这个A题是可以遍历求所有解的&#xff0c…

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇

文章目录 通过CSV文件创建物料主数据的一些建议在DIF中使用CSV文件文件转换器类型BAdIBAdI 示例代码测试 DIF全篇总结 通过CSV文件创建物料主数据的一些建议 在Staging Area中创建/修改小批量的物料主数据&#xff0c;推荐使用标准文件上载功能&#xff08;USMD_FILE_UPLOAD&am…

计算机基础--Redis

参考文献 https://zhuanlan.zhihu.com/p/599663544 基础知识 1. Redis的数据类型及使用场景 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff…

使用assembly插件对boot项目打zip和war部署包

目录 一、maven-assembly-plugin插件的简单使用 1、什么是assembly&#xff1f; 2. 常见的maven插件 3、如何使用&#xff1f; 二、如何通过assembly打不同的包 三、boot项目如何转成war包部署 背景&#xff1a;之前项目上已经使用了assembly对多个boot项目分别打zip包且…

MATLAB应用笔记

其他 1、NaN值 MATLAB判断数据是否为NaN可以直接使用函数&#xff1a;isnan() 三、数据分析 1、相关性 均值、方差、协方差、标准差、相关系数 mean() %均值 nanmean()%去除NAN值求均值 var() %方差 cov() %协方差 std() %标准差 corrcoef(B,b) %R 相关系数plot()…

[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

文章目录 一、前言二、SQL Server 主从同步的原理介绍三、具体的搭建过程3.1 准备工作3.1.1 卸载旧版本&#xff08;如果有&#xff0c;可选&#xff0c;非必须&#xff09;3.1.2 安装 Docker3.1.3 验证本地 Docker 是否安装成功 3.2 创建 Docker 网络3.3 创建主从节点的 SQL S…

部署环境从docker swarm迁移到k8s后kie-server的发布方式变化(二)

正如后来的考虑, 如果外接maven私库照理说是ok的, 这样去掉volume的设计整个流程更加的自动化标准化. 开搞 第一步先部署一个nexus yaml文件如下: apiVersion: v1 kind: Namespace metadata:name: nexus---apiVersion: v1 kind: Service metadata:labels:k8s-app: nexusname…

【数据结构与算法】八大排序

[数据结构与算法]八大排序 数据结构与算法-八大排序排序的概念及其应用排序的概念排序的应用 常见的排序算法实现常见的排序算法插入排序直接插入排序希尔排序(缩小增量排序)希尔排序的时间复杂度希尔排序对插入排序的优化效果 选择排序直接选择排序堆排序向上调整建堆&#xf…