【C++初阶】:C++入门篇(一)

news2024/11/15 17:05:15

文章目录

    • 前言
      • 一、C++命名空间
        • 1.1 命名空间的定义
        • 1.2 命名空间的使用
      • 二、C++的输入和输出
        • 2.1 cin和cout的使用
      • 三、缺省参数
        • 3.1 缺省参数的分类
      • 四、函数重载
        • 4.1 函数重载概念及其条件
        • 4.2 C++支持函数重载原理 -- 名字修饰

在这里插入图片描述

前言

C++是在C语言的基础之上,增加了一些面向对象的编程思想,增加了一些有用的库,所以有了学习C语言的经验,学习C++其实很容易的。至于C++初阶,我们可以认为C++的出现其实就是为了弥补C语言在某些方面的不足之处。所以从这篇开始,一起来学习C++,以及C++到底弥补了C语言的哪些不足。

一、C++命名空间

学过C++的人都知道,在学习C++的过程中,比如在某些视频教程中,教我们写的第一个程序往往都是打印hello world,但是每次在写的过程中,老师们都叫我们去忽略一些东西,比如using namespace std; 那这句话到底有什么用呢?

无论是C语言还是C++,在同一个局部域里面是不允许出现相同的变量名的,在同一个作用域下定义了两个相同变量名的变量会导致访问冲突,编译器不知道该使用哪个变量,从而导致报错。不仅仅是变量名,函数名相同也是一样的(C++函数重载除外)。这也导致在一群人写同一个项目时,写完在合并之后可能导致函数名或变量名冲突的问题,为解决这个问题,C++的命名空间孕育而生。

命名空间的目的就是对标识符的名称进行本地化避免命名冲突或名字污染,namespace关键字就是为了解决这样的问题。
在这里插入图片描述

1.1 命名空间的定义

定义命名空间时,需要用到namespace这个关键字,后面紧跟命名空间的名字,再接一队 {}{} 中为命名空间的成员。
一个命名空间就是定义了一个新的作用域,命名空间的所有内容都局限于这个命名空间中。

namespace N1  // 命名空间N1
{
	int a = 10;
	void test()
	{
		printf("test() a = 10\n");
	}
}

namespace N2  // 命名空间N2
{
	int a = 20;
	void test()
	{
		printf("test() a = 20\n");
	}
	namespace N3  // 命名空间N3, 命名空间的嵌套
	{
		struct Node
		{
			struct Node* next;
			int data;
		};
	}
}
1.2 命名空间的使用

要使用命名空间的内容有三种方法,第一种就是命名空间名称加作用域限定符
格式:命名空间名称::命名空间成员

int main()
{
	printf("%d\n", N1::a); // :: 是作用域限定符
	N1::test();
	printf("%d\n", N2::a);
	N2::test();
	N2::N3::Node node;
	node.data = 123;
	printf("%d\n", node.data);
	return 0;
}

在这里插入图片描述
方法二:使用using将某个命名空间的某个成员引入。
格式:using 命名空间名称::命名空间成员

using N1::a; // 
using N2::N3::Node;
int main()
{
	printf("%d\n", a);
	printf("%d\n", N2::a);
	Node node;
	node.data = 456;
	printf("%d\n", node.data);
	return 0;
}

在这里插入图片描述
方法三:使用using namespace 命名空间名称引入。(不推荐)
格式:using namespace 命名空间名称;

using namespace N2;

int main()
{
	printf("%d\n", a);
	test();
	printf("%d\n", N1::a);
	N1::test();
	N3::Node node;
	node.data = 789;
	printf("%d\n", node.data);
	return 0;
}

在这里插入图片描述
注意:使用 using namespace 命名空间名称; 就相当于破坏了作用域之间的封闭性,将命名空间中的成员全部暴露出来了。在日常练习中,建议直接using namespace std即可,这样就很方便。

了解完命名空间后,我们也算知道了为什么每次写C++程序时总要写一句using namespace std; std::是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。

C++标准库,C++ Standard Library,是类库和函数的集合,其使用核心语言写成,由c++标准委员会制定,并不断维护更新。

using std::cout;  // 分别将cout和endl释放出来
using std::endl;

int main()
{
	cout << N1::a << endl;
	cout << N2::a << endl;
	N2::N3::Node node;
	node.data = 111;
	cout << node.data << endl;
	return 0;
}

在这里插入图片描述

二、C++的输入和输出

C++作为一门新的语言,不但可以兼容C语言,C++自己也有属于自己的独有语法,最典型的就是C++不仅可以使用C语言中的printfscanf,也可以使用自己的输入输出语句,cout(输出)cin(输入),这两个都是全局的流对象,endl是特殊的C++符号,表示换行。
cout标准输出对象(控制台)和cin标准输入对象(键盘)都必须包含iostream头文件以及按照命名空间使用方法使用std
coutcin分别是ostreamistream类型的对象,<<>> 分别是流插入运算符流提取运算符,实际是运算符重载过来的。

2.1 cin和cout的使用
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int a = 0;
	cin >> a; // cin和cout可以自动识别类型
	cout << a << endl;
	return 0;
}

在这里插入图片描述

三、缺省参数

缺省参数就是在给函数声明或定义时给函数的参数一个默认的值,在调用该函数时,如果没有给函数传递实参的话,该函数调用时就会采用该形参的缺省值,如果调用时传递了实参,就采用指定的实参。

void test1(int a = 20)
{
	cout << a << endl;
}

int main()
{
	int a = 10;
	test1();  // 没有传参时,使用参数的默认值
	test1(a);  // 有参数传递时,使用指定的实参
	return 0;
}

在这里插入图片描述

3.1 缺省参数的分类
  1. 全缺省参数

函数的每个参数都有自己的默认值,这样的参数就是全缺省参数。

void test2(int a = 10, int b = 20, int c = 30)
{}
  1. 半缺省参数

函数的部分参数有默认值,其余参数没有参数值。

void test3(int a, int b = 10, int c = 20)
{}

半缺省参数必须从右往左依次给,中间不能间隔,传参时也无法指定传参。另外,函数的缺省值不能再声明和定义中同时出现。那么,函数的缺省值是在函数的声明给还是在函数的定义时给呢

其实只要我们仔细想一下就应该知道缺省值应该在函数的声明时给,因为函数往往都是先声明后使用,如果我们在声明函数时没有缺省值,但定义时又给了缺省值,就容易导致声明与定义不一致,另外,修改函数的声明比修改函数的定义要方便。

注意:函数的缺省值必须要是常量或则是全局变量,C语言不支持缺省参数其实就是C语言的编译器不支持。

四、函数重载

4.1 函数重载概念及其条件

自然语言中存在一词多义的现象,其意思需要人去结合上下文去判断,这就是词的重载,所以函数重载就是C++中允许同一个作用域中拥有功能相似的同名函数,同名函数之间的形参列表(形参类型、个数、类型顺序)不同,来处理一些功能类似数据类型不同的问题。

以下四个test01函数都构成函数重载。

// 参数个数不同
void test01()
{
	cout << "test01()" << endl;
}
// 参数类型不同
void test01(int a)
{
	cout << "test01(int a)" << endl;
}
// 参数类型顺序不同
void test01(int a, double b)
{
	cout << "test01(int a, double b)" << endl;
}

void test01(double a, int b)
{
	cout << "test01(double a, int b)" << endl;
}

注意:函数的返回值不构成函数重载,因为只有返回值相同的话会造成调用歧义,编译器不知道该调用哪个函数,从而编译报错。

4.2 C++支持函数重载原理 – 名字修饰

C++为什么可以支持函数重载,而C语言为什么不可以支持?
学习C语言的时候,可以知道,一个程序要运行起来,需要经历四个阶段:预处理编译汇编链接
在这里插入图片描述
编译之后,会有一个符号表,函数会有自己的名字修饰,像Windows中VS的函数名修饰规则有点复杂,我们可以通过Linux下的gcc来查看函数名修饰规则。
在Linux下我们可以先用gcc编译一下C语言代码,然后通过objdump -S 可执行文件来查看这个汇编代码,从而看C语言下的函数名修饰规则。

在这里插入图片描述
在这里插入图片描述
通过汇编代码,可以看到C语言下函数名就是修饰后的名字。所以如果C语言中有两个名字相同的函数,那么修饰后的名字也是一样的,编译器不知道该调用哪一个,导致编译报错。

现在我们用g++去编译C++的代码,然后去看一下汇编后函数名会修饰成什么样子。
在这里插入图片描述

在这里插入图片描述
通过汇编代码可以看到C++不是单纯的用函数名进行修饰的,在函数名的前面加了一个 _Z 的前缀,函数名的后面是函数参数类型的缩写,id就表示该函数的参数类型是int和double类型,而di就表示该函数的参数类型是double和int类型,通过函数调用时传递的实参类型,决定调用哪一个函数。不会存在调用冲突的问题。

这也就是为什么C语言为什么不能支持函数重载的原因(同名函数编译后无法区分),而C++通过函数名修饰规则来区分,只要参数不一样,修饰出来的名字就不一样,也就支持了函数重载。

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

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

相关文章

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

Git入门 -- 区域详解

Git入门 – 区域详解 1.Git 1.1 Git与SVN的区别 Git不仅仅是版本控制系统&#xff0c;同时也是内容管理系统。以下是Git与SVN的区别&#xff1a; 分布式&#xff1a;Git是分布式但SVN不是&#xff0c;这是Git与其他系统的核心区别。存储方式为元数据&#xff1a;Git在存储数…

Python 如何使用正则表达式进行复杂文本处理

正则表达式&#xff08;Regular Expressions&#xff0c;简称 regex 或 RE&#xff09;是一种强大的工具&#xff0c;用于在文本中执行模式匹配和搜索操作。通过正则表达式&#xff0c;你可以轻松地查找、替换和提取文本中的特定模式。Python 提供了一个内置的 re 模块&#xf…

数据结构--树(笔记)

文章目录 1. 含义及术语2. 应用3. 常见二叉树种类① 二叉树(Binary tree)一般树和二叉树的区别 ② 完美二叉树(Perfect Binary tree)③ 完全二叉树(Complete Binary tree)④ 满二叉树(Full Binary tree)完美二叉树、完全二叉树和满二叉树 ⑤ 平衡二叉树(Balanced Binary tree)二…

基于STM32开发的智能门锁系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化密码输入与验证门锁控制与状态指示Wi-Fi通信与远程监控应用场景 家庭智能门锁办公室智能门禁系统常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门锁系统通过集成键盘模块…

自学编程从哪个语言入手比较好?

自学编程时选择哪个语言作为起点&#xff0c;仍然取决于你的个人兴趣、学习目标和职业规划。希望以下建议可以帮到你。 Python&#xff1a; 如果你对数据分析、机器学习、人工智能、Web 开发或自动化脚本编写等领域感兴趣&#xff0c;Python 是一个非常好的起点。它的语法简洁…

java如何通过jdbc操作数据库

1. 安装JDBC 官网地址&#xff1a;官网地址选择 下载后&#xff0c;解压缩&#xff0c;然后将mysql-connector-j-9.0.0.jar文件放到项目目录下 编写操作数据库代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql…

20240819 每日AI必读资讯

&#x1f4da;AI爆料人遭全网封禁&#xff01;OpenAI等25个机构祭大招&#xff0c;一眼辨别AI机器人 - 最近半个月&#xff0c;全网被OpenAI的「AI爆料人」「草莓哥」iruletheworldmo愚弄。所有人没有等他预测的GPT-4o large模型&#xff0c;反被AI初创MultiOn创始人揭穿身份—…

Squid:概念、代理案例

目录 Squid 缓存代理 Web代理的工作机制 代理类型 传统代理 透明代理 使用代理的好处 示例和案例 Squid安装示例 使用源码包安装Squid 一些其他的安装参数&#xff08;安装用时较长&#xff09; 为什么异步io要指定线程数&#xff1f; 配置和初始化Squid 运行测试…

大咖齐聚!2024深圳eVTOL展首批发言嘉宾阵容亮相!

大咖齐聚&#xff01;2024深圳eVTOL展首批发言嘉宾阵容亮相&#xff01; 由上海市航空学会、广东省航空航天学会主办的2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心盛大召开。 2024深圳eVTOL产业发展大会由主论坛与低空经济、航电系…

一年秀一次!稚晖君的人形机器人上新了,还有开源、免费彩蛋

一年一秀&#xff0c;稚晖君的第二代人形机器人来了。 灵巧小手&#xff0c;正在麻将桌上叱咤风云&#xff1a; 不对不对&#xff0c;让我们先看看整体气质&#xff1a; 然后是常规家务&#xff0c;能看出来也是非常熟练&#xff1a; 在大模型风靡的 2024 年&#xff0c;如果说…

FreeRtos----------- 同步互斥

一、同步的缺陷&#xff1a;全局变量协同两个任务 1.建立两个任务&#xff1a;CalcTask 、LcdPrintTask xTaskCreate(CalcTask, "task1", 128, NULL, osPriorityNormal, NULL);xTaskCreate(LcdPrintTask, "task2", 128, &g_Task2Info, osPriorityNorm…

详解Element-UI el-table表格中勾选checkbox(selection)多选删除

本节讲解的是关于组件库中el-table组件多选删除功能的实现。 1.Vue文件内的引用 2.页面数据 3.存储多选数据 4. 处理多选数据 这里通过循环的方式找到数据并对数据删除&#xff0c;这种方式易于理解&#xff0c;但不一定是最优方案

springboot的自动配置和怎么做自动配置

目录 一、Condition 1、Condition的具体实现 2、Condition小结 &#xff08;1&#xff09;自定义条件 &#xff08;2&#xff09;SpringBoot 提供的常用条件注解 二、Enable注解 三、EnableAutoConfiguration 注解和自动配置 1、EnableAutoConfiguration的三个注解属性…

LLama 3 跨各种 GPU 类型的基准测试

2024 年 4 月 18 日&#xff0c;AI 社区对 Llama 3 70B 的发布表示欢迎&#xff0c;这是一款最先进的大型语言模型 &#xff08;LLM&#xff09;。该型号是 Llama 系列的下一代产品&#xff0c;支持广泛的用例。该模型 istelf 在广泛的行业平台上表现良好&#xff0c;并提供了新…

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置&#xff1a; Ⅰ、Eclipse 的必要配置&#xff1a;1、Eclipse 的安装&#xff1a;其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件&#xff0c;傻瓜式安装即可; 2、设置工作空间(workspace)&#xff1a;其一、首次启动…

源头分析: 网络安全的分布式方法

部署网络可见性和网络检测和响应 (NDR) 解决方案来收集、查看和分析网络活动&#xff0c;以检测网络上的可疑和恶意活动。 这些解决方案中的大多数都是为了将数据从收集点 (或传感器) 移动到中央存储库进行分析而构建的。 这种方法有几个缺点&#xff0c;包括规模、性能、成本…

乌龟对对碰在线版

爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材&#xff0c;现在使用小兔子代替。 体验地址&#xff1a;幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰&#xff1a;写文章-CSDN博客 乌龟对对碰-幸运对对碰

无需测试环境!如何利用测试脚手架隔离微服务,实现功能自动化

以下为作者观点&#xff1a; 想在不建立完整测试环境的情况下测试微服务&#xff1f; 想在将变更推送到主线分支之前完成测试&#xff1f; 这是我们在进行项目交付时经常遇到的难题。最近&#xff0c;当我们开始一个新的项目&#xff0c;为客户构建一个新的聚合平台时&#…

【springboot】springboot接口参数全局解密,解决request内容修改后如何重新设置回去的问题

文章目录 核心思路spring&servelt基础核心接口类body解密核心原理讲解get解密核心原理讲解 核心思路 拦截每次请求 所以要么在拦截器 要么在过滤器中做 (正常来说 其实只能在过滤器做)修改request中的参数把修改后的参数设置回去(难点&#xff09; spring&servelt基础…