初识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.hqwc.cn/news/576755.html

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

相关文章

Elasticsearch 和 Kibana 8.13:简化 kNN 和改进查询并行化

作者&#xff1a;Gilad Gal, Tyler Perkins, Srikanth Manvi, Aris Papadopoulos, Trevor Blackford 在 8.13 版本中&#xff0c;Elastic 引入了向量搜索的重大增强&#xff0c;并将 Cohere 嵌入集成到其统一 inference API 中。这些更新简化了将大型语言模型&#xff08;LLM&a…

嵌入式学习44-哈希算法和排序算法

Hash 哈希算法&#xff1a; 在记录的 存储位置 和它的 关键字 之间建立一种去特定的对应关系&#xff0c;使得每个关键字key对应一个存储位置&#xff1b; 查找时&#xff0c;根据确定的对应关系&#xff0c;找到给定的 key 的映射。 记录的存储位置 f&a…

快消品如何去做商业模式?循环购模式给你答案!

大家好 我是吴军 一家软件开发公司的产品经理 我司主营商城系统 商业模式打造 现已有两百多种现成商业模式 商业模式千千万 今天给大家带来一种 复购率高 适合快消品的商业模式 第一快消品其实利润不高&#xff0c;有些老板会说我利润就那么点&#xff0c;我怎么去分&…

Android开发 --- Android12外部存储权限问题

1.问题 Android 11中强制启用Scoped Storage是为了更好地保护用户的隐私&#xff0c;以及提供更加安全的数据保护。拥有对整个SD卡的读写权限&#xff0c;在Android 11上被认为是一种非常危险的权限&#xff0c;同时也可能会对用户的数据安全造成比较大的影响。Android12使用如…

【微服务】Nacos(配置中心)

文章目录 1.AP和CP1.基本介绍2.说明 2.Nacos配置中心实例1.架构图2.在Nacos Server加入配置1.配置列表&#xff0c;加号2.加入配置3.点击发布&#xff0c;然后返回4.还可以编辑 3. 创建 Nacos 配置客户端模块获取配置中心信息1.创建子模块 e-commerce-nacos-config-client50002…

pulsar: kafka on pulsar之把pulsar当kafka用

一、下载协议包&#xff08;要和pulsar版本比较一致&#xff09; https://github.com/streamnative/kop/releases?q2.8.0&expandedtrue二、在pulsar的根目录创建一个protocols目录&#xff0c;将上述包放到这个目录里 三、编辑broker.conf(如果是集群)或者standalone.con…

30-3 越权漏洞 - 水平越权(横向越权)

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、定义 攻击者可以访问和操作与其拥有同级权限的用户资源。 示例: 学生A在教务系统上正常只能修改自己的作业内容,但由于不合理的权限校验规则等原因,学生A可以修改学生B的内…

提升回归测试效率,让测试事半功倍!

回归测试&#xff0c;在软件开发中简直是个不折不扣的大头。要保证新功能不乱入或者修复的bug不搞砸老功能&#xff0c;这活儿可不好干。尤其是现在软件越来越大&#xff0c;开发周期也越来越紧&#xff0c;咋才能在有限的时间内搞定高效的回归测试呢&#xff1f;这就得来点妙招…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

机器学习入门:概念、步骤、分类与实践

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

亚信安慧AntDB的数据处理优势

AntDB的“融合实时”的特性&#xff0c;不仅使得数据库具备了更强大的适应性&#xff0c;更让企业在不同业务场景下能够更好地实现业务目标&#xff0c;释放出更大的商业价值。融合实时的特性让AntDB具有了高度灵活性和实时性&#xff0c;使其能够满足企业在不同业务需求下的快…

|行业洞察·汽车|《新能源汽车行业发展及营销策略分析-35页》

报告的主要内容解读&#xff1a; 行业环境&#xff1a;报告指出&#xff0c;海外车企的电动化进程遇到阻碍&#xff0c;而中国新能源汽车市场持续增长&#xff0c;2023年销量占全球新能源汽车的63.5%&#xff0c;市占率达到31.6%。 市场政策&#xff1a;中国政府通过减免税收、…