初识C++ · 入门(1)

目录

前言:

1 命名空间

2 输入和输出

3 缺省参数

5 函数重载


前言:

C++与C语言是有一定交集的,可以理解为本贾尼在使用C语言的时候认为有缺陷,于是加了一些小语法进行改良,后来经过委员会的修改,C++98问世了,是第一部标准版本。

学习C++之前我们先来看一个代码:

int rand = 0;
int main()
{
    printf("%d ",rand);
    return 0;
}

这个代码在C语言里面是有个大问题的,就是重定义的问题,写过猜随机数的朋友都知道rand是一个函数,我们常说命名不能以关键字命名,实际上我们定义变量的时候定义成函数的名字也会冲突,这时候本贾尼不舒服了,觉得这个名字我一定要取,所以加入了命名空间(namespace)的概念。

C++创建文件的时候后缀是.cpp,与C语言有区别。


1 命名空间

命名空间(namespace),我们可以理解为创建了一个新的域,比如创建变量的时候有局部域,全局域,命名空间就是单独创建一个域出来:

namespace XY
{
	int rand = 1;
}

花括号里面的空间就是名为XY的一块命名空间,与结构体不同的是花括号最后没有分号,那么我们是不是可以打印这个值了?实际上并不能,就像一块地被占用了,没有地主人的声明我们是不能进入的:

正确的使用方法是加一个using ,即展开命名空间,使用的变量前面加上两个冒号,冒号左边是要使用的空间名,如果是空,默认在全局域寻找该变量,使用变量的时候系统也是有查找顺序的:

先在局部域查找,再到全局域查找,最后到命名空间里面查找,这其实也是为什么局部变量和全局变量命名冲突了优先局部变量。

以下是两段参考代码:

namespace XY
{
	int rand = 1;
}
using namespace XY;
int main()
{
	printf("%d ", XY::rand);
	return 0;
}
int a = 10;
int main()
{
	int a = 1;
	printf("%d ", ::a);
	return 0;
}

命名空间解决的是命名冲突的问题,当命名空间里面的成员足够多的时候,比如有数组,有函数,有指针等到,我们只想用里面的一个怎么办呢?很简单,直接指定就行了。

namespace byte
{
	int a = 1;
	int b = 2;
	int c = 3;
	int Add(int a, int b)
	{
		return a + b;
	}
}

using byte::Add;
using byte::a;

int main()
{
	printf("%d ", Add(1, 2));
	printf("%d ", a);
	return 0;
}

如果我们要展开整个命名空间,就需要在using后面加namespace,如果我们只是使用某个命名空间里面特定的成员,我们指定using就行了,这里是命名空间的一种用法——引入成员。

但是命名空间名字一样怎么办?

名字一样的时候就相当于是两块空间合并:

namespace byte
{
	int a = 1;
}
namespace byte
{
	int a = 10;
	int c = 0;
}
int main()
{
	printf("%d ",byte::a);
	return 0;
}

这时候就会报错,重定义。

命名空间也可以进行嵌套使用:

namespace byte
{
	int a = 1;
	namespace bit
	{
		int a = 10;
	}
}
int main()
{
	printf("%d ",byte::bit::a);
	return 0;
}

2 输入和输出

学习C语言的时候我们第一堂课学的是打印Hello world ,那么C++怎么实现呢?

C++的输入输出用到的是cout和cin,其中的c对应的是控制台console,out和in不用多说,那我们打印一个试试:

int main()
{
	cout << 1;
	int a = 0;
	cin >> a;
	cout << a;
	return 0;
}

cout后面加两个小于号就是输出,可就这段代码是打印不出来的,因为它们对应的头文件是iostream,与C语言不同的是他不用加.h后缀,光加头文件还不行,cout和cin在这个头文件里面不错,但是C++为了防止命名冲突,加了命名空间,空间的名字是std,所以正确用法是:

using namespace std;

using std::cout;
using std::endl;
using std::cin;

int main()
{
	cout << 1 << endl;
	int a = 0;
	cin >> a;
	cout << a;
	return 0;
}

平时写代码的时候我们直接展开整个命名空间是没有问题的,做项目的时候为了防止定义的类型与库里面的冲突,常常指定展开。

endl可以理解为是换行。

int main()
{
	cout << "Hello world!" << ' ' << 1234 << endl;
	return 0;
}

cout cin这种输入输出的方式是很方便的,不像printf还要指定占位符,cout cin是可以自动识别数据类型的,这是一个优势,但是打印的时候如果涉及到了精度,我们不妨用printf,cout也可以指定精度但是比较麻烦,c++兼容C语言那我们就看哪个方便咯。


3 缺省参数

缺省参数听起来可能难以理解,换个名字,叫做默认参数,就容易理解了,缺省参数就是指创建函数的时候给参数一个默认值:

using namespace std;
int Add(int x = 1, int y = 10)
{
	return x + y;
}

int main()
{
	cout << Add();
	return 0;
}

Add函数有两个参数,我们一个不给,那么使用函数的时候就会使用给的默认参数。

上面的两个参数全部都有默认值,那么这种被称为全缺省参数,另一种就是半缺省参数,这里的半不是指一半,是指只要有参数没给默认值的情况下就被称为半缺省参数。

int Sub(int x,int y = 1)
{
	return x - y;
}
int main()
{
	cout << Sub(1);
	return 0;
}

但是半缺省参数有个规定:参数只能从右往左缺省。

int Add(int x = 1,int y,int z)
{
	return x + y + z;
}

这样就是错误,存在歧义,给参数的时候是从左往右给还是从右往左给呢,所以委员会规定只能从右往左缺省:

int Add(int x,int y = 1,int z = 2)
{
	return x + y + z;
}
int main()
{
	cout << Add(1);
	return 0;
}

缺省参数还有两个要注意的点就是:
1 缺省参数在定义和声明的时候应该保持一致。

2 半缺省参数不能跳着给。

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

4 C语言不支持缺省类型。


5 函数重载

void Func(int ,int )
{
	cout << 111;
}
void Func()
{
	cout << 222;
}
int main()
{
	Func();
	return 0;
}

上述代码会报错吗?函数名是一样的。

在C语言里面这段代码是会报错的,但是C++里面就不会,因为C++支持函数重载,C语言不支持函数重载。

函数重载成立的条件是有函数名相同在同一个域中参数个数不同参数类型不同参数顺序不同。

前两个条件必满足,后面三个条件满足任意一个就满足函数重载,函数重载是为了解决函数名相同的问题而诞生的,函数重载有个很智能的点就是系统会根据你给参数的情况来判断该调用哪个函数。

void Func(int x = 1,int y = 1)
{
	cout << 111;
}
void Func()
{
	cout << 222;
}
int main()
{
	Func();
	return 0;
}

但是我们应该避免这种带有歧义的代码,虽然参数类型确实不同,但是不传参的话任意的Func函数都可以被调用,所以就会报错。

那为什么C++支持函数重载而C语言不支持呢?

详细介绍起来可能有点麻烦,这里牵扯到函数命名规则以及编译等知识,所以我们简单介绍即可:

C语言在链接的时候是通过函数名去找函数栈帧的,那么函数名一样的情况下就会导致报错,C++不一样,C++会变相的给函数改一个名字,在链接的时候会通过修改后的名字去查找。

int Func();
int main()
{
	Func();
	return 0;
}

括号里面的一长串就是函数名被修饰过后的名字,?Func@@YAHXZ,所以C++调用函数的时候是通过这个名字去寻找的,C语言就是直接通过名字找,这就是为什么C++支持函数重载C语言不支持函数重载。


感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统&#xff0c;其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前访视、术中记录及术后…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

如何使用Python读取、旋转和和创建空白的PDF文件

试想象一下&#xff0c;你正在处理一堆PDF文件&#xff0c;需要从中提取一些信息或者修改其中的内容。如果你不使用Python&#xff0c;你可能需要手动打开每个文件&#xff0c;复制粘贴你需要的内容&#xff0c;然后再保存为一个新的文件。这简直是一场噩梦&#xff01;但是&am…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

手写启动类(start)

为什么要手写一个start&#xff1f; 简化代码&#xff0c;仅使用一个注解就可以实现分页功能(以下以分页为例)。 1.定义一个pageX注解 Documented Retention(RetentionPolicy.RUNTIME)//运行时可以通过反射API获取到注解信息 Target({ElementType.METHOD, ElementType.TYPE})…

redis的设计与实现(四)——单机数据库特性

1. 前言 我们前面了解了redis的数据结构&#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心&#xff0c;这篇文章我们就了解一下吧。 2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN&#xff0c;等…

【opencv】教程代码 —ImgProc (10)图像平滑处理

10. Smoothing.cpp 图像平滑处理 演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用&#xff0c;并显示滤波后的效果。 /*** 文件 Smoothing.cpp* 简单滤镜的样例代码* 作者 OpenCV团队*///引入所需库文件 #includ…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

一周学会Django5 Python Web开发-Django5模型查询(上)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

NLP深入学习:结合源码详解 BERT 模型(三)

文章目录 1. 前言2. 预训练2.1 modeling.BertModel2.1.1 embedding_lookup2.1.2 embedding_postprocessor2.1.3 transformer_model 2.2 get_masked_lm_output2.3 get_next_sentence_output2.4 训练 3. 参考 1. 前言 前情提要&#xff1a; 《NLP深入学习&#xff1a;结合源码详…

2024年N1叉车司机证考试题库及N1叉车司机试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证考试题库及N1叉车司机试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的…

串口通信标准RS232 RS485 RS422的区别

RS-232、RS-422、RS-485是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;它们之间的几个不同点如下&#xff1a; 一、硬件管脚接口定义不同 二、工作方式不同 RS232&#xff1a; 3线全双工 RS…

在线教学软件推荐!一站式白板让线上教学更顺畅!

可以用于线上教学的软件&#xff0c;之前大家最为熟悉的莫过于使用各类视频会议软件&#xff0c;如腾讯会议、钉钉会议、飞书会议、Zoom 等&#xff0c;基于视频会议软件来共享电脑屏幕&#xff0c;然后再切换到本地的 PPT 演示文稿进行讲解。 但采用这个线上教学方案存在一些…

如何用磁力仪探测管缆的位置和埋深?

不论是航空磁测&#xff0c;还是海洋磁测&#xff0c;都是直接测量磁场总强度T&#xff0c;而后以总磁异常ΔT成图。磁异常总强度Ta是磁场总强度T与正常场T0的矢量差&#xff0c;即&#xff1a; Ta&#xff1d; T&#xff0d; T0 根据参考文献1&#xff0c;2的推导&#xff0c…

2024信息通信展览会|中国通信展览会|通讯大会

2024信息通信展览会|中国通信展览会|通讯大会 2024年中国国际信息通信展览会与同期举办的ICT.中国论坛于2024年9月25-27日在北京.国家会议中心隆重举办&#xff0c;共同奋力开启信息通信的新篇章。这是一场集交流、展示、共赢于一体的盛大盛典&#xff0c;为信息通信领域的企业…

保研线性代数机器学习基础复习2

1.什么是群&#xff08;Group&#xff09;&#xff1f; 对于一个集合 G 以及集合上的操作 &#xff0c;如果G G-> G&#xff0c;那么称&#xff08;G&#xff0c;&#xff09;为一个群&#xff0c;并且满足如下性质&#xff1a; 封闭性&#xff1a;结合性&#xff1a;中性…

一种重要却容易被我们忽略的能力

你有多久没有「发呆」过了&#xff1f; 我指的不是那种偶尔的走神和分心&#xff0c;而是那种持续一段时间&#xff0c;什么也不做、什么也不想&#xff0c;就这样静静站着或坐着&#xff0c;让大脑放空的状态。 可能有人会觉得&#xff1a;这太奢侈了&#xff0c;我们每天都恨…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

分享一下自己成功入职为AIGC工程师的经历

据外媒援引知情人士消息&#xff0c;OpenAI预计2023年收入将达到2亿美元&#xff0c;到2024年将达到10亿美元&#xff0c;全世界都看出了AIGC工程师的市场潜力。 而对于广大职场人士而言&#xff0c;则是意味着新的职场机遇出现了&#xff0c;学习好AIGC技术&#xff0c;无论是…
最新文章