初识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.rhkb.cn/news/290044.html

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

相关文章

华为云使用指南02

5.​​使用GitLab进行团队及项目管理​​ GitLab旨在帮助团队进行项目开发协作&#xff0c;为软件开发和运营生命周期提供了一个完整的DevOps方案。GitLab功能包括&#xff1a;项目源码的管理、计划、创建、验证、集成、发布、配置、监视和保护应用程序等。该镜像基于CentOS操…

【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印

iPhone13 Pro 长焦相机水印&#xff08;黑斑&#xff09;修复 洗水印 问题描述 iPhone13 Pro 后摄3倍相机有黑色斑点&#xff08;水印&#xff09;&#xff0c;如图所示&#xff0c; 后摄相机布局如图所示&#xff0c; 修复过程 拆机过程有风险&#xff0c;没有把握最好不要…

HTB devvortex靶机记录

做这个靶机的师傅们我先提一句&#xff0c;不知道是否是因为网速还是其他因素影响&#xff0c;登录后台管理后&#xff0c;有大概率会被其他人挤下去&#xff0c;所以做这道题的师傅可以考虑在没人的时候去做。 打开靶场以后老规矩nmap扫一遍 这里爆出了80端口和22端口&#xf…

葵花卫星影像应用场景及数据获取

一、卫星参数 葵花卫星是由中国航天科技集团公司研制的一颗光学遥感卫星&#xff0c;代号CAS-03。该卫星于2016年11月9日成功发射&#xff0c;位于地球同步轨道&#xff0c;轨道高度约为35786公里&#xff0c;倾角为0。卫星设计寿命为5年&#xff0c;搭载了高分辨率光学相机和多…

AI大模型智能大气科学探索之:ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

本文深度探讨人工智能在大气科学中的应用&#xff0c;特别是如何结合最新AI模型与Python技术处理和分析气候数据。介绍包括GPT-4等先进AI工具&#xff0c;旨在帮助大家掌握这些工具的功能及应用范围。内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战案例…

Web Components使用(一)

在使用Web Components之前&#xff0c;我们先看看上一篇文章Web Components简介&#xff0c;其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术&#xff1a;Custom elements&#xff08;自定义元素&#xff09;、Shadow DOM&#…

Unity2018发布安卓报错 Exception: Gradle install not valid

Unity2018发布安卓报错 Exception: Gradle install not valid Exception: Gradle install not valid UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action1[T] progress) (at <c67d1645d7ce4b76823a39080b82c1d1>:0) …

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机&#xff08;JVM&#xff09;&#xff1f; Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么&#xff1f; JVM包括以下组件&#xff1a; ● 类加载器&#xff08;ClassLoa…

|行业洞察·中国制造业|《融合新一代信息技术的中国制造业数字…级关键技术与应用》

报告内容的详细解读&#xff1a; 1. 数字化转型升级与智能制造 报告指出智能制造是先进制造技术与新一代信息技术的深度融合&#xff0c;涵盖产品、制造、服务全生命周期的各个环节。新一代智能制造产生出大数据&#xff0c;实现了人、信息、物理三元融合&#xff0c;新基建助…

前端基础知识html

一.基础标签 1.<h1>-<h6>:定义标题&#xff0c;h最大&#xff0c;h最小 2.<font>&#xff1a;定义文本的字体&#xff0c;尺寸&#xff0c;颜色 3.<b>&#xff1a;定义粗体文本 4.<i>&#xff1a;定义斜体文本 5.<u>&#xff1a;定义文本下…

3.28作业

#include <iostream> using namespace std; // 构造函数示例 class MyClass { private: int data; public: // 默认构造函数 MyClass() { data 0; } // 带参数的构造函数 MyClass(int value) { data value; } …

【Linux 驱动基础】Linux platform平台设备驱动

# 前置知识 总线驱动模型简介&#xff1a; 总线是处理器与一个或者多个设备之间的通道&#xff0c;在设备模型中&#xff0c;所有的设备都是通过总线相连&#xff0c;当然也包括虚拟的 platform 平台总线。 总线驱动模型中有三要素&#xff1a; 1. 总线 /*** struct bus_ty…

Vite 为什么比 Webpack 快?

目录 1. Webpack 的构建原理 2. Script 的模块化&#xff08;主流浏览器对 ES Modules 的支持&#xff09; 3. Webpack vs Vite 开发模式的差异 对 ES Modules 的支持 底层语言的差异 热更新的处理 1. Webpack 的构建原理 前端之所以需要类似于 Webpack 这样的构建工具&…

发票是扫码验真好,还是OCR后进行验真好?

随着科技的进步&#xff0c;电子发票的普及使得发票的验真方式也在不断演进。目前&#xff0c;我们常见的发票验真方式主要有两种&#xff1a;一种是扫描发票上的二维码进行验真&#xff0c;另一种是通过OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别…

线性代数 - 应该学啥 以及哪些可以交给计算机

AI很热&#xff0c;所以小伙伴们不免要温故知新旧时噩梦 - 线代。 &#xff08;十几年前&#xff0c;还有一个逼着大家梦回课堂的风口&#xff0c;图形学。&#xff09; 这个真的不是什么美好的回忆&#xff0c;且不说老师的口音&#xff0c;也不说教材的云山雾绕&#xff0c;单…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述 在…

linux 内存介绍

大致共有四类&#xff1a;VSS、RSS、PSS、USS &#xff0c;通常情况下&#xff0c;VSS > RSS > PSS > USS 1.VSS(Virtual Set Size)虚拟耗用内存&#xff08;包含共享库占用的内存&#xff09; VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已…

Linux:Jenkins:参数化版本回滚(6)

上几章我讲到了自动集成和部署 Linux&#xff1a;Jenkins全自动持续集成持续部署&#xff08;4&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136977106 当我们觉得这个页面不行的时候&#xff0c;需要进行版本回滚&#xff0c;回滚方法我这里准备了…

Memcached非关系型数据库介绍

使用背景 Memcached 不是一个数据库&#xff0c;而是一个高性能的分布式内存对象缓存系统。它主要用于减轻数据库负载&#xff0c;提高动态Web应用的速度、可扩展性和性能。Memcached 的工作原理是将数据存储在内存中&#xff0c;以提供快速的数据访问。当应用程序需要访问数据…

基于springboot+vue+Mysql的家政服务管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…