初识C++——关键字,输入输出,函数名修饰,引用

news2024/11/27 4:27:09

文章目录

  • C++的常用关键字
  • C++的输入输出
  • C++支持重载的原理------名字修饰
    • windows下的名字修饰规则
  • 引用
    • 引用的概念
    • 引用的特点
    • 使用场景
      • 做参数
    • 做返回值
    • 常引用

C++的常用关键字

C++的常用关键字一共有63个,其中包括有C语言的关键字,这些关键字我们在后面的文章中都会讲到,大家可以在以后的文章中看到这些关键字,所以没有必要在这里记住这些关键字。这里只是一个汇总。

在这里插入图片描述

C++的输入输出

我们来写一段每个程序员在学习一门语言时刚开始就会写的一段代码,那就是hello world。

#include <iostream>
using namespace std;

int main()
{
	cout << "hello world" << endl;
	return 0;
}

我们来对这个代码段做一些解释

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
    iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,
    这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有
    一个章节更深入的学习IO流用法及原理。
    注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应
    头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,
    规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因
    此推荐使用 <iostream> +std的方式
#include <iostream>
using namespace std;

int main()
{
	//可以自动识别变量的类型
	cout << "hello world" << endl;
	return 0;
}

C++支持重载的原理------名字修饰

首先我们需要思考一个问题,为什么C++支持重载而C语言却不支持重载?
我们需要了解 一个C++程序时如何运行起来的,这里和C语言是相应的。
需要经过 :

预处理 头文件展开/宏替换/去掉注释/条件编译 生成 .i 文件

编译 检查语法,生成汇编代码,生成 .s文件
在这里插入图片描述

汇编 将汇编代码生成二进制机器码,生成 .o文件

链接 合并链接,生成可执行程序 exe文件。
在这里插入图片描述

C语言预处理阶段的介绍

在这里我们需要注意的是,在编译阶段编译器会生成符号表,符号表的内容为函数名+函数地址的映射,这可以使我们方便的跳转到函数体执行函数体的语句,但是在C++中,引入了重载函数,这就需要在符号表中添加一些规则使得相同函数名的函数可以被区分出来。C++把这些规则称为名字修饰(name Mangling),我们可以通过vs编译器来验证这一点:

在这里插入图片描述
在这里插入图片描述

windows下的名字修饰规则

在这里插入图片描述

需要注意的是:返回值不同是没有办法构成重载的,因为调用时编译器没有办法区分。
我们来回答上面的问题:由于C语言没有函数名修饰规则,所以C语言不支持函数重载。

引用

引用的概念

引用不是新定义了一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
通俗来讲就是调皮的同学给取的外号。
引用的定义方式:
在这里插入图片描述

引用的特点

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体
    在这里插入图片描述

使用场景

做参数

//以二叉树的前序遍历为例,我们需要一个变量来遍历数组,如果我们在函数里面定义i的话会导致
//函数每次递归调用都会为i建立栈帧,这显然不符合我们的要求,我们需要在外面定义一个i把它的地址传进去,但是使用引用我们就不用传地址了,大大提高了效率。
typedef struct TreeNode {
	int val;
	struct TreeNode* left;
	struct TreeNode* right;
}* TreeNode;

int BTreeSize(TreeNode& root)
{
	if (root == NULL)
	{
		return 0;
	}
	int lcount = BTreeSize(root->left);
	int rcount = BTreeSize(root->right);
	return lcount + rcount + 1;

}
void _preorderTraversal(TreeNode& root, int* a, int& ri)
{
	if (root == NULL)
	{
		return;
	}
	a[(ri)++] = root->val;
	_preorderTraversal(root->left, a, ri);
	_preorderTraversal(root->right, a, ri);
}
int* preorderTraversal(TreeNode& root, int* returnSize) {
	*returnSize = BTreeSize(root);
	//malloc一个数组
	int* a = (int*)malloc(sizeof(int) * (*returnSize));
	//执行前序遍历
	//下标
	int i = 0;
	_preorderTraversal(root, a, i);
	return a;
}

做返回值

int Add(int a)
{
	int n = a;
	return n;
}

//函数的返回值为引用类型
int& Add(int a, int b)
{
	int c = a + b;
	return c; //我们不提倡这么做
}

int main()
{
	int ret = Add(5, 5);
	cout << ret << endl; //打印10
	cout << ret << endl;
	cout << Add(5) << endl;
	cout << Add(5)<< endl;
	return 0;
}

解释:
在这里插入图片描述

结论:
如果函数返回时,出了函数作用域,如果返回对象还在(还没还给操作系统),则可以使用引用返回,如果已经还给操做系统了,则必须使用传值返回。

使用案例,通过引用修改数组空间的值。
在这里插入图片描述

常引用

在这里只需要注意,权限可以缩小和平移但是不能放大。

int main()
{
	const int a = 10;
	//权限被放大会报错
	//int& b = a; 
	//权限平移
	const int& b = a;
	//权限缩小
	int x = 10;
	const int& c = x;
	//这是可以的
	int n = 10;
	double f = n;
	
	//这里会产生临时变量,而临时变量具有常性
	//如果不加const会产生权限放大的问题。加上
	//const就是权限平移
	double d = 10.0;
	const int& m = d;
	return 0;
}

我们下一篇再见!

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

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

相关文章

如何高效实现文件传输:小文件采用零拷贝、大文件采用异步io+直接io

一般会如何实现文件传输&#xff1f; 服务器提供文件传输功能&#xff0c;需要将磁盘上的文件读取出来&#xff0c;通过网络协议发送到客户端。如果需要你自己编码实现这个文件传输功能&#xff0c;你会怎么实现呢&#xff1f; 通常&#xff0c;你会选择最直接的方法&#xf…

嵌入式学习_Day 003

程序功能介绍 c #include <stdio.h> int main() {char c,ll;printf("please enter a capital letter:");cgetchar();getchar();if (c>A&& c<Z) {llc32;printf("Lowercase letter output:%c\n",ll);printf("ASCII value:%d\n"…

阿含经人物传记知识图谱与问答系统设计20230725(进行中)

基本思路—— 1 数据提取 以《房山石经》阿含经为核心&#xff0c;提取经文索引、内容、关键词等数据&#xff0c;构成excel数据&#xff1b; 2 数据清洗 从数据库中重新建构角色画像数据&#xff0c;形成佛、辟支佛、尊者、比丘、比丘尼……等各类人物数据 3 数据映射&…

缠论线段的划分

第一种情况&#xff1a; 第二种情况&#xff1a; 第二种情况中的特例&#xff1a; 第二种情况的特例&#xff1a; 顶分型成立&#xff1a; 向上线段延续&#xff1a; 顶分型后面底分型&#xff0c;形成三段 插入一个分型的反面例子&#xff1a; dd

软件测试外包公司怎么选?CMA/CNAS软件测试报告的优势

在当前信息化和全球化的背景下&#xff0c;软件测试外包公司是很多企业选择的一种方式。因为软件测试外包公司具备丰富的专业能力和经验&#xff0c;能够提供高质量的测试服务。同时&#xff0c;外包公司可以根据客户需求灵活组织测试团队&#xff0c;并且能够及时响应和处理问…

微信怎么批量删除好友?

今天我们来说说微信怎么批量删除好友。 为什么会想要说这个呢&#xff0c;原因是我有一个朋友离职后发朋友圈求助说离职后怎么把前同事们都删除。在日常使用微信中&#xff0c;相信也有些朋友对于一些毫不相关的好友想要删除掉。 一般的做法都是一个一个删除&#xff0c;但很繁…

上位机软件wincc通过工业网关采集plc数据实现组态监控

WinCC是一个组态软件&#xff0c;可以用于数据采集与监控、自动化控制、工业物联网等领域。WinCC可以帮助用户实现工厂自动化和过程自动化的解决方案&#xff0c;提供可视化的监控界面和数据采集分析功能&#xff0c;支持多种协议和设备&#xff0c;如Siemens、Modbus、OPC等。…

数据库应用:Redis持久化

目录 一、理论 1.Redis 高可用 2.Redis持久化 3.RDB持久化 4.AOF持久化&#xff08;支持秒级写入&#xff09; 5.RDB和AOF的优缺点 6.RDB和AOF对比 7.Redis性能管理 8.Redis的优化 二、实验 1.RDB持久化 2.AOF持久化 3.Redis性能管理 4.Redis的优化 三、总结 一、…

C# 数据结构】Heap 堆

【C# 数据结构】Heap 堆 先看看C#中有那些常用的结构堆的介绍完全二叉树最大堆 Heap对类进行排序实现 IComparable<T> 接口 对CompareTo的一点解释 参考资料 先看看C#中有那些常用的结构 作为 数据结构系类文章 的开篇文章&#xff0c;我们先了解一下C# 有哪些常用的数据…

进入元宇宙,半岛体育打开新世界大门

上赛季西甲联赛在新赛季开启之际,宣布与科技公司Stadio Plus合作,计划在元宇宙平台Decentraland的Vegas City打造西甲主题地块,与Z世代球迷更好地互动,这进一步推高了外界对于“体育元宇宙”的关注。伴随着AR/VR、云计算、AI等技术的日益成熟,叠加后疫情因素的影响,从源头的训练…

K8S:容器日志收集与管理

Kubernetes 里面对容器日志的处理方式&#xff0c;都叫作 cluster-level-logging&#xff0c;即&#xff1a;这个日志处理系统&#xff0c;与容器、Pod 以及 Node 的生命周期都是完全无关的。这种设计当然是为了保证&#xff0c;无论是容器挂了、Pod 被删除&#xff0c;甚至节点…

Linux_CentOS_7.9部署Docker以及镜像加速配置等实操验证全过程手册

前言&#xff1a;实操之前大家应该熟悉一个新的名词DevOps 俗称开发即运维、新一代开发工程师&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&…

【*1800树上贪心】CF1401 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;1尽可能少&#xff0c;那就是让pi尽可能不合并地摊到所有边上&#xff0c;然后计算贡献 按照CF惯用套路&#xff0c;这样的n^2贡献肯定是更换枚举对象&#xff0c;我们去枚举边&#xff0c;按边…

Docker consul 的容器服务更新与发现

目录 一、Consul 简介 1.什么是服务注册与发现 2. 什么是consul 3.consul 架构 二、部署 consul 服务器&#xff08;192.168.88.10&#xff09; 1.建立 Consul 服务 2.查看集群信息 3.通过 http api 获取集群信息 三、registrator服务器&#xff08;192.168.88.60&…

Gnomon水下环境 下

不会全下去 鱼群 方向反了&#xff0c;位置不对 不动了 速度快&#xff0c;一个条 数量太多 太卡 使用的弧线没问题 &#xff0c;这块我有点晕 水泡制作 运动严重 减少晃动 turbulenceField1.phaseZ time*20; 总结 使用晶格调节大概样子,变成柔体 particleShape1.daxiaorand(…

shell实现数据库分库分表备份

#!/bin/bash2 3 backup/backup/db #存放数据库的位置4 nodatabasesinformation_schema|mycat|performance_schema|sys|mysql #要过滤的数据库5 6 mysql -uroot -predhat -e "show databases" -N | egrep -v "${nodatabases}" > dbname #将数据库存放在…

ansible自动化运维(二)剧本、角色编写实战

&#x1f618;作者简介&#xff1a;一名运维工作人员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动动小…

在C语言中,变量主要的作用是什么?

常量记忆数据只能存储一个固定的数据&#xff0c;永远不变&#xff0c;所以这当然不能算得上是记忆数据 变量存储的数据可以改变&#xff0c;你可以让它记忆5&#xff0c;下一步它可以变为10 如果你还无法理解 那么请不用尝试变量编程实现以下&#xff1a; 输入一个100之内…

Cesium态势标绘专题-简单箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

NoSQL-Redis持久化

NoSQL-Redis持久化 一、Redis 高可用&#xff1a;1.概述&#xff1a; 二、Redis持久化&#xff1a;1.持久化的功能&#xff1a;2.Redis 提供两种方式进行持久化&#xff1a; 三、RDB 持久化&#xff1a;1.定义&#xff1a;2.触发条件&#xff1a;3.执行流程&#xff1a;4.启动时…