初识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.mzph.cn/news/778785.shtml

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

相关文章

深度学习故障诊断实战 | 数据预处理之基于滑动窗的数据样本增强

前言 本期给大家分享介绍如何基于滑动窗方法进行数据样本增强 背景 深度学习模型训练需要大量的样本。在故障诊断领域&#xff0c;每个类别大都会达到300个样本。但是在实际公开数据集中&#xff0c;以CWRU数据集为例&#xff0c;每个类别只有24组数据&#xff0c;这明显是不…

CSGO赛事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

ExpandableNotificationRow的父类layout

ExpandableNotificationRow的父类layout NotificationsQuickSettingsContainer NotificationPanelView NotificationShadeWindowView ExpandableNotificationRow 就是下图的一个 Notification&#xff1a; USB连接 。 何时创建一个ExpandableNotificationRow 并且被添加到Not…

Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

本文是 SpringBoot 开发的干货集中营&#xff0c;涵盖了日常开发中遇到的诸多问题&#xff0c;通篇着重讲解如何快速解决问题&#xff0c;部分重点问题会讲解原理&#xff0c;以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题&#xff0c;既方便自己也方便他人&…

护眼台灯对眼睛有危害吗?多款预防近视的台灯推荐

在日常生活中&#xff0c;灯光对于我们而言&#xff0c;是非常重要的&#xff0c;尤其是在夜晚&#xff0c;不管是学习还是办公都需要合适的光线环境。很多家长为了保护孩子的视力会选择从台灯下手&#xff0c;但又不知道护眼台灯对眼睛有危害吗&#xff1f;今天就来好好的告诉…

【MySQL】数据库--表操作

目录 一、创建表 二、查看表 三、修改表 1. 添加字段--add 2.修改表名--rename to 3.修改列名--change 4.修改字段的数据类型--modify 5.删除字段&#xff08;列&#xff09;--drop 四、删除表 一、创建表 create [temporary]table[if not exists]table_name [([colu…

python如何获取word文档的总页数

最近在搞AI. 遇到了一个问题&#xff0c;就是要进行doc文档的解析。并且需要展示每个文档的总页数。 利用AI. 分别尝试了chatGPT, 文心一言&#xff0c; github copilot&#xff0c;Kimi 等工具&#xff0c;给出来的答案都不尽如人意。 给的最多的查询方式就是下面这种。 这个…

【Canvas与艺术】硬朗风格十二棱表表盘

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>硬朗风格十二棱表表盘</title><style type"text/css…

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来&#xff0c;本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

深入Facebook的世界:探索数字化社交的无限可能性

引言 随着数字化时代的到来&#xff0c;社交媒体平台已经成为了人们日常生活中不可或缺的一部分&#xff0c;而其中最为突出的代表之一便是Facebook。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅仅是一个社交网络&#xff0c;更是一个数字化社交的生态系统&#…

机器人机械手加装SycoTec 4060 ER-S电主轴高精密铣削加工

随着科技的不断发展&#xff0c;机器人技术正逐渐渗透到各个领域&#xff0c;展现出前所未有的潜力和应用价值。作为机器人技术的核心组成部分之一&#xff0c;机器人机械手以其高精度、高效率和高稳定性的优势&#xff0c;在机械加工、装配、检测等领域中发挥着举足轻重的作用…

Python学习:lambda(匿名函数)、装饰器、数据结构

Python Lambda匿名函数 Lambda函数&#xff08;或称为匿名函数&#xff09;是Python中的一种特殊函数&#xff0c;它可以用一行代码来创建简单的函数。Lambda函数通常用于需要一个函数作为输入的函数&#xff08;比如map()&#xff0c;filter()&#xff0c;sort()等&#xff0…

C++ 多线程和互斥锁(一文搞定)

实验 简介&#xff1a;我们启动并行启动两个线程&#xff0c;但设置一个全局互斥锁&#xff0c;在两个线程中等待并占用互斥锁&#xff0c;然后输出日志。 代码 #include <iostream> #include <thread> /* C 多线程库 */ #include <mutex> …

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…

2015年认证杯SPSSPRO杯数学建模A题(第二阶段)绳结全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 A题 绳结 原题再现&#xff1a; 给绳索打结是人们在日常生活中常用的技能。对登山、航海、垂钓、野外生存等专门用途&#xff0c;结绳更是必不可少的技能之一。针对不同用途&#xff0c;有多种绳结的编制方法。最简单的绳结&#xff0c;有时称…

机器学习和深度学习的简单对比

如图1-2所示&#xff0c;深度学习&#xff08;DeepLearning&#xff0c;DL&#xff09;属于机器学习的子类。它的灵感来源于人类大脑的工作方式&#xff0c;这是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念&#xff0c;可理解为包含多…

实战 | 微调训练TrOCR识别弯曲文本

导 读 本文主要介绍如何通过微调训练TrOCR实现弯曲文本识别。 背景介绍 TrOCR&#xff08;基于 Transformer 的光学字符识别&#xff09;模型是性能最佳的 OCR 模型之一。在我们之前的文章中&#xff0c;我们分析了它们在单行打印和手写文本上的表现。 TrOCR—基于Transforme…

系统分析师-数学与经济管理

系统架构设计师 系统架构设计师-软件开发模型总结 文章目录 系统架构设计师前言一、最小生成树二、最短路径三、网络与最大流量四、不确定型决策 前言 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽象思维能力和逻辑推理能…