C++数据类型以及函数设计学习记录

一、C++类型转换原则

        当表达式中出现了多种类型数据的混合运算时,往往需要进行类型转换。表达式中的类型转换分为两种:隐式转换和显式转换,但此处仅对隐式转换进行总结。

        隐式转换分为算术转换和其它隐式类型转换两大类,其它隐式类型转换又主要包含数组转换为指针、指针的转换、布尔类型转换、常量转换等[1]。其中,在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(隐式转换),此转换基本原则为低类型数据转换为高类型数据[2]

1 隐式转换

1.1算术转换

        ①若运算对象同为有符号类型或无符号类型,低类型数据转换为高类型数据。类型高低顺序为(由低至高):char-short-int-unsigned-long-unsigned long-float-double

        ②若一个运算对象是无符号类型、另一个运算对象是有符号类型,而且其中的无符号类型不小于有符号类型,那么有符号的运算对象转换为无符号的。需要注意的是,若有符号类型是负数,则会依据“趋负无穷取模”将负数转换为正数

        ③基于②,若有符号类型大于无符号类型,此时转换依赖于机器对类型的表示字节数,,如int、long。

        【注:ISO C++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:(signed/unsigned)char ≤ (unsigned)short ≤ (unsigned)int ≤ (unsigned)long】

1.2其它隐式类型转换

1.2.1 数组转换为指针

        在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针,如函数形参表达等。但是,数组引用、当数组被用作decltype关键字的参数、作用于取地址符&、作用于sizeof以及作用于typeid时,上述隐式转换不会发生。

1.2.2 指针的转换

        常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换为void*;指向任意对象的指针能转换为const void*。

1.2.3 布尔类型转换

        如果指针或算术类型的值为0,转换结果为false;否则转换结果为true。

1.2.4 常量转换

        允许将指向非常量类型的指针转换为指向相应的常量类型的指针,对于引用也一样。

二、运算符优先级与结合性

图源:C++语言程序设计 / 郑莉,董渊编著

三、函数基础

(一)基础概念

        自动对象:对于普通局部变量对应的对象来说,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁它。我们把只存在于块执行期间的对象称为自动对象(“块”指的是“{}”内含的程序块)。

        局部静态对象:局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在函数结束执行也不会对它有影响(创建局部静态对象,即将局部变量定义成static类型)。

        函数的参数传递:①形参的类型决定了形参和实参交互的方式。如果形参是引用类型,它将绑定到对应的实参上,此时对应的实参被引用传递或者函数被传引用调用;否则,当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象,此时实参被值传递或者函数被传值调用。(需要注意的是,数组不允许拷贝,无法以值传递方式使用数组参数

                                    ②当用实参初始化形参时会忽略掉顶层const。即,当形参有顶层const时,传给它常量对象或者非常量对象都是可以的。

        函数重载:如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。对于重载的函数来说,它们应该在形参数量形参类型上有所不同(不允许两个函数除了返回类型外其它所有的要素都相同)。

        内联函数:请求编译器在可能的情况下在调用点展开函数(定义内联函数,即在函数前添加inline标识)。一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。(补充理解:调用函数一般比求等价表达式的值要慢一些。在大多数机器上,一次函数调用其实包含着一系列工作)

        函数指针:函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型形参类型共同决定,与函数名无关。

        tuple类型(标准库特殊类型):tuple是类似于pair的模板。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可以与另一个tuple类型不同。tuple的主要使用目的是将一些数据组合成单一对象,而避免定义新数据结构来表示

图源:C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译.

(二)实验实践

1、顶层const引用(常量引用)形参影响实践

实验基础代码

# include<iostream>
# include<string>

using namespace std;

// 打印出字母串内包含的大写字母,并将大写字母改写为小写字母
// 注:该展示原始代码报错,左值*b不可修改
void ToUpper(const string &str)
{
	for (auto b = str.begin(); b != str.end(); ++b)
		if (isupper(*b))
		{
			cout << *b << endl;
			*b = tolower(*b);
		}
	return;
}

int main()
{
	const string test_string = "AppLe";
	cout << "原始测试数据:AppLe" << endl;
	ToUpper(test_string);
	cout << "测试后数据:" + test_string << endl;
	return 0;
}

实验结果图

实验结论笔记

        在不改变传入数据的情况下,尽量使用常量引用。其原因有①把函数不会改变的形参定义为普通引用容易产生误解,即函数可以修改它的实参的值;②使用普通引用而非常量引用会极大地限制函数所能接受的实参类型,如图六、图七所示。

2、多返回值函数简单设计方法

实验代码

# include<iostream>
# include<string>
# include<vector>

using namespace std;

// 同类型多值返回
// 返回A大写字母开头的单词
vector<string> F1_Msame(const vector<string> wordList)
{
	vector<string> A_List;
	for (const string word : wordList)
		if (*(word.begin()) == 'A')
			A_List.push_back(word);
	return A_List;
}


int main()
{
	// 测试数据
	vector<string> test_data = {"bar","A","crush","brush","Apple","view","Aka"};
	vector<string> result = F1_Msame(test_data);
	for (auto w : result)
		cout << w << "   ";
	return 0;
}
# include<iostream>
# include<string>
# include<vector>
# include<tuple>

using namespace std;

// 不同类型多值返回
// 返回每一个A大写字母开头的单词与它所对应的索引值
vector<tuple<string, size_t>> F2_Mdiff(const vector<string> wordList)
{
	vector<tuple<string, size_t>> Aidx_List;
	for (size_t i = 0; i != wordList.size(); ++i)
		if (wordList[i][0] == 'A')
			Aidx_List.push_back(make_tuple(wordList[i],i));
	return Aidx_List;
}


int main()
{
	// 测试数据
	vector<string> test_data = {"bar","A","crush","brush","Apple","view","Aka"};
	vector<tuple<string, size_t>> result = F2_Mdiff(test_data);
	for (tuple<string, size_t> w : result)
		cout << "(" << get<0>(w) << ','<< get<1>(w) << ')' <<endl;
	return 0;
}

实验结果图

实验笔记

Ⅰ 双引号“”包含的字面值为字符串char*,单引号‘’包含的字面值为字符char;

Ⅱ C++11新标准规定,函数可以返回花括号{}包围的值的列表。此处返回的列表用来对表示函数返回的临时量进行初始化。如果列表为空,临时量执行值初始化;否则,返回的值由函数的返回类型决定。

3、函数指针实践(练习6.54/练习6.55/练习6.56)

实验代码

# include<iostream>
# include<vector>

using namespace std;


// 函数一:对两个int类型进行加法运算
int intAdd(int a,int b)
{
	int c = a + b;
	return c;
}

// 函数二:对两个int类型进行减法运算
int intSub(int a, int b)
{
	int c = a - b;
	return c;
}

// 函数三:对两个int类型进行乘法运算
int intPro(int a, int b)
{
	int c = a * b;
	return c;
}

// 函数四:对两个int类型进行除法运算
int intDiv(int a, int b)
{
	int c = 0;
	if (b == 0)
		throw runtime_error("除数不能为零!");
	else
		c = a / b;
	return c;
}


int main()
{
	vector<int (*)(int, int)> FuncCalList = {intAdd,intSub,intPro,intDiv};
	for (auto Fptr : FuncCalList)
		cout << Fptr(2, 4) << endl;
	return 0;
}

实验结果图

实验笔记

Ⅰ 函数名作为一个值使用时,该函数自动地转换为指针;

Ⅱ 可以直接使用指向函数的指针调用该函数,无须提前解引用指针;

参考资料:

[1] C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译. —北京:电子工业出版社,2013.9.(第四章-表达式,第六章-函数)

[2] C++语言程序设计 / 郑莉,董渊编著.—5版.—北京:清华大学出版社,2020.11.(第三章-函数)

Debug参考资料:

[3] C++不允许使用不完整的类型说明-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧港口解决方案:PPT全文69页,附下载

关键词&#xff1a;智慧港口解决方案&#xff0c;数字化港口&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头&#xff0c;智慧港口发展趋势 一、智慧港口建设背景 随着数字经济、智慧交通发展&#xff0c;强调“要大力发展智慧交通和智慧物流”“努力打造世界一流的…

京东方将取代三星显示,引领可折叠面板市场 | 百能云芯

在智能手机市场蓬勃扩张的浪潮中&#xff0c;中国面板制造巨头京东方将在2023年第4季超越三星显示&#xff0c;引领可折叠面板市场。 据市调公司DSCC数据显示&#xff0c;今年下半年&#xff0c;原本独占鳌头的三星电子在可折叠手机市场的份额将从去年同期的86%降至72%&#xf…

一些好用的VSCode扩展

可以在扩展这里直接搜索需要的扩展&#xff0c;点击安装即可。 1.Chinese 中文扩展&#xff0c;就是说虽然咱们懂点英语&#xff0c;但还是中文看着方便 2.Auto Rename Tag 当你重命名一个HTML 标签时&#xff0c;会自动重命名与他配对的HTML 标签 当你选择h4这个标签时&…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时&#xff0c;工具在幻灯片的左下方&#xff0c;本工具在幻灯片的右侧&#xff0c;可以移动&#xff0c;可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等&#xff0c;点画笔切换橡皮擦&#xff0c;点插入绘图&#xff0c;将背景…

用什么样的开源流程表单实现办公流程化?

近日&#xff0c;有不少热心网友询问道&#xff1a;如果要实现流程化办公&#xff0c;让整个办公效率火速提升上来&#xff0c;可以用什么样的开源流程表单工具&#xff1f;大伙都知道&#xff0c;随着低代码开发平台的盛行&#xff0c;办公效率也得到很大的提升&#xff0c;它…

【LeetCode: 2415. 反转二叉树的奇数层 | BFS + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法 文章目录 针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法Abstractscreen和tmux介绍tmux常用命令以及快捷键Byobu简单操作步骤集锦参考文献 Abstract PyTorch多卡并行运行程序is one of the mos…

西科大微机原理实验四(定时器程序设计)

任务一、 按实验要求内容新建一个ASM41.ASM文件,使用masm命令生成obj文件并输入 上述源程序中使用了外部资源,该外部资源存在于文件 LIB_TIM.OBJ中,因此使用link命令将 ASM41.OBJ 和 LIB_TIM.OBJ 一起链接生成可执行文件 使用debug加载程序并进行调试 使用-g指令,回显如下…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

FPGA - 1、Simulink HDL coder模型例化到FPGA

Simulink HDL coder模型例化到FPGA 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右…

2024年程序员必备的五大Golang框架

Go语言&#xff0c;简称Golang&#xff0c;是由Google公司开发的一种编程语言&#xff0c;主要特点是简单、快速、安全和高效。在近年来&#xff0c;Golang的应用范围不断扩大&#xff0c;它的高效性和易于编写的特点在互联网领域广受欢迎。Golang在开发Web服务、网络编程、云计…

【正点原子STM32连载】第十三章 串口通信实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十…

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…

什么是前端响应式设计(responsive design)?如何实现响应式布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【MySQL】表的操作

表的操作 MySQL表的操作1、创建表2、创建表案例3、查看当前数据库下所有的表4、查看表结构5、查看创建表时的相关细节6、修改表7、删除表 MySQL表的操作 1、创建表 创建表的SQL语法如下&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释…

python|获取接口请求耗时

你想知道我们请求一个url的时候&#xff0c;握手和请求资源分别占用多长时间么&#xff1f;今天我们使用python写个小案例来看看吧。 项目展示 打开项目&#xff0c;修改hosts、port、methods以及url的变量&#xff0c;即可运行python程序便可获得该页面的详细信息的时间&…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8&#xff01; 在分析 GC 日志时&#xff0c;可以同时采用多种工具&#xff08;Arthas、gceasy、JVM 连接 Graphana 监控&#xff09;进行分析&#xff0c;避免某种工具分析不准确 gceasy 每个月只可以免费…

移动滑轨屏的运用是否对传统展览展示效果产生了哪些影响?

移动滑轨屏因其独特的展示外观和形式&#xff0c;也常被人们称为滑轨电视、电动滑轨&#xff0c;主要由滑动轨道、显示屏、感应装置、控制系统等组件结合实现&#xff0c;是一种解决了传统展览内容展示局限的多功能互动装置&#xff0c;能够呈现动态内容并与用户产生互动交流&a…

【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

00. 目录 文章目录 00. 目录01. 按键控制LED接线图02. 按键控制LED程序示例03. 光敏传感器控制Buzzer接线图04. 有源蜂鸣器原理图05. 光敏传感器控制Buzzer示例06. 程序示例下载07. 附录 01. 按键控制LED接线图 02. 按键控制LED程序示例 led.h #ifndef __LED_H__ #define __L…