【小梦C嘎嘎——启航篇】C++ 基础中的精华(二)

news2024/12/23 13:58:50

【小梦C嘎嘎——启航篇】C++ 基础中的精华(二)😎

  • 前言🙌
    • 1、引用的使用场景
      • 1.1 做参数
      • 1.2 做返回值
    • 2、const修饰 的引用
      • 2.1 权限上的探讨
        • 2.1.1权限放大
        • 2.1.2 权限平移
        • 2.1.3 全新缩小
    • 4、函数重载的延伸
      • 条件编译:
    • 条件编译格式
      • if格式
      • ifdef格式
      • ifndef格式
      • 4.1 为什么C++ 支持函数重载而C语言不支持函数重载
      • 符号表
    • 5、C程序能否调用C++的库?或者C++程序能否调用C语言的库
    • 6、extern "C"的作用
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,分享C嘎嘎的基础知识知识~ 都是精华内容,可不要错过哟!!!😍😍😍

1、引用的使用场景

1.1 做参数

  • 输出型参数
  • 大数据传参,不要进行拷贝,提高效率

1.2 做返回值

  • 引用返回,可以直接对返回值进行修改。
  • 传值返回,会产生一个临时变量,不能直接对返回值进行修改,其具有常属性。
  • 任何的类型转换,例如整形提升、类型转换都是对临时变量的是修改,而不是对原数据修改。

2、const修饰 的引用

2.1 权限上的探讨

这里的权限,指的是引用带出来的。

2.1.1权限放大

这是不允许的。

2.1.2 权限平移

这是可以的

2.1.3 全新缩小

这是可以的。

以下面代码为例分析:

int func()
{
	int a = 0;

	return a;
}

int main()
{
	const int& ret = func();

	const int a = 0;

	// 权限的放大
	// int& b = a;
	
	//int b = a; 可以的,因为这里是赋值拷贝,b修改不影响a

	// 权限的平移
	const int& c = a;

	// 权限的缩小
	int x = 0;
	const int& y = x;

	int i = 0;
	const double& d = i;

	return 0;
}

4、函数重载的延伸

一个程序的完整运行,必须经过这四个阶段:预处理 – 编译 – 汇编 – 预处理

  • 预处理(test.cpp):进行头文件展开,宏替换,去掉注释,条件编译
  • 编译(test.i): 检查语法,生成汇编语言代码(指令级代码)
  • 汇编(test.o):将汇编代码生成二进制机器码
  • 链接(test.exe): 合并链接,生成可执行程序。

条件编译:

对于条件编译,相关资料给出的解释是:**条件编译功能:预处理程序提供了条件编译的功能。条件编译允许只编译源文件中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销,并提高程序的效率,**可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。另外,条件编译是为了让程序在各种不同的软硬件环境下都以运行。即,提高了程序的可移植性和灵活性

条件编译格式

在C语言中,若要对程序中的代码段有条件地进行编译,就要用到条件编译命令,条件编译主要有如下几种格式:

if格式

#if 表达式``   ``语句序列①``[#``else``   ``语句序列②]``#endif

功能:当表达式的值为真时,编译语句序列①,否则编译语句序列②。其中,#else和语句序列②可有可无。

ifdef格式

#ifdef   标识符``   ``语句序列①``[#``else``   ``语句序列②]``#endif

功能:当标识符已被定义时(用#define定义),编译语句序列①,否则编译语句序列②。其中#else和语句序列②可有可无。

ifndef格式

#ifndef   标识符``   ``语句序列①``[#``else``   ``语句序列②]``#endif

功能:该格式功能与ifdef相反。

4.1 为什么C++ 支持函数重载而C语言不支持函数重载

符号表

在这里插入图片描述

  • 在符号表中,C语言是利用函数名对函数进行标识的

在C语言中,是直接利用函数的函数名来形成符号表的。因此,当函数名相同时,系统在通过符号表来确定要调用函数的所在地址时,就会发生冲突,从而发生链接错误。

  • C++之父看到C语言的这个缺陷,便在C++上引入了函数名修饰规则。就是其是利用函数名和参数类型在符号表中作为自己的唯一标识。

  • 返回值不同,不能构成函数重载。

  • 如果函数名修饰规则带入返回值,也是不能构成函数重载的。因为,在调用的时候,不能指定返回值类型。

在这里插入图片描述

为什么C++ 支持函数重载而C语言不支持函数重载? 我的理解是:因为一个程序的完整执行过程是包括:预处理、编译、汇编、链接。而在链接的过程中,会将.o的文件合并在一起,并会去符号表里去查找对应的调用函数。函由于C++引入了数名修饰规则,根据函数名和参数类型区分函数以及同名函数。因此支持函数重载。而C语言是直接利用函数名来标识的,因此函数名相同时,链接的过程去寻找对应调用的函数时,就会发生冲突,从而产生链接错误。

5、C程序能否调用C++的库?或者C++程序能否调用C语言的库

其实是可以的,但是需要进行一些修改。只能对C++语言编译器进行extern,因为C++编译器是支持C的,而C编译器不支持C++。

6、extern "C"的作用

简单的来说,就是告诉编译器,用C语言的规则。例如,下面是让C++编译器按照C语言的函数名修饰规则,在编译阶段形成符号表并执行相应的操作。

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
	void StackInit(ST* ps);
	void StackDestroy(ST* ps);
	void StackPush(ST* ps, STDataType x);
	void StackPop(ST* ps);
	STDataType StackTop(ST* ps);
	bool StackEmpty(ST* ps);
	int StackSize(ST* ps);
#ifdef __cplusplus
}
#endif // __cplusplus


总结撒花💞

   本篇文章旨在分享的是分享C嘎嘎的基础知识。希望大家通过阅读此文有所收获
   😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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

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

相关文章

自定义类型详解(C语言)

自定义类型 一. 结构体1.1 什么是结构体1.2 结构体的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.5.1 结构体变量的定义1.5.2 结构体变量的初始化 1.6 结构体内存对齐1.6.1 为什么存在内存对齐 1.7 修改默认对齐数1.8 结构体传参 二. 位段2.1 什么是位…

PVE安装好后拔显卡后连接不了网络

目录 前因 原因 解决办法 前因 前几天装了个​Proxmox​ ve当做一个服务器7*24开机 但是由于转好系统后,显卡就不需要了 加上它耗电的原因(我的gtx650平时空载有10w左右的功耗) 我在想拔显卡拔了,我用xshell进行ssh连接不就…

MVCC:多版本并发控制

MVCC 1. MVCC是什么2. 快照读和当前读2.1 快照读2.2 当前读 3. Read View3.1 Read View中含有什么内容3.2 ReadView的规则 4. MVCC整体操作流程 1. MVCC是什么 MVCC(Multi Version Concurrency Control),多版本并发控制;MVCC用于…

【数学建模】——相关系数

第一部分:皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数:皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小,根据数组满足的不同条件,我们要选…

linux图形界面总结——X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考: 一、 linux图形界面 linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程…

网络类型及数据链路层协议

目录 网络类型的分类 数据链路层协议 MA网络以太网协议 P2P网络 HDLC ---高级数据链路控制协议 更改链路协议的方法 HDLC数据帧封装结构 PPP---点到点协议 PPP协议的优点 PPP数据帧封装结构 PPP会话的搭建 链路建立阶段---LCP建立 认证阶段 网络层协议协商阶段--- NCP协商 网络…

大型风电叶片研发项目管理体系建设实践︱中车时代新材PMO负责人姚运帅

中车株洲时代新材料科技股份有限公司风电运维事业部总经理、PMO负责人姚运帅先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:大型风电叶片研发项目管理体系建设实践。大会将于8月12-13日在北京举办,敬请关注&#xff01…

sqlserver 存储过程当中如何实现增删改查

--声明存储过程 新增编辑 ALTER procedure [dbo].[Eng_MyAddOrEdtADPro] My_Cocode int, Type int, -- --1 新增 2 编辑 My_KeyId uniqueidentifier, My_PCode int, My_SCode int, My_PName nvarchar(36), My_SName nvarchar(36), My_Orde…

IPUU的小工具拍了拍你(下)

IPUU是埃文科技旗下的综合性IP查询网站,提供多维度的IP数据信息。通过在线查询,用户可以获取目标IP地址的详尽信息,包括位置属性、网络属性、风险属性以及业务属性等,同时还可以查询域名信息。无论您是需要查看某个IP地址归属地&a…

1.13 通过aop日志监控service执行时间

步骤1&#xff1a;添加aop依赖包 <!-- aop切面 依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>步骤2&#xff1a;创建AOP日记监控记录切面类 …

微服务架构——配置中心

「配置中心」&#xff0c;顾名思义&#xff0c;就是用来统一管理项目中所有配置的系统。虽然听起来很简单&#xff0c;但也不要小瞧了这个模块。如果一个中型互联网项目&#xff0c;不采用配置中心的模式&#xff0c;一大堆的各类配置项&#xff0c;各种不定时的修改需求&#…

TMS Aurelius v5.15 Source Crack

TMS Aurelius v5.15 Source Crack 面向Delphi的ORM框架&#xff0c;完全支持数据操作、复杂和高级查询、继承、多态等。。。 功能详细信息 支持多个数据库服务器(MS SQL Server、Firebird、MySQL、DB2、Interbase、Oracle等) 支持多个数据库访问组件(dbExpress、AnyDac、SQLDir…

Linux驱动开发:设备树dts详解

前言&#xff1a;掌握设备树是 Linux 驱动开发人员必备的技能&#xff01;因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树(也有支持老式驱动的&#xff0c;比较少)&#xff0c;最新出的 CPU 其驱动开发也基本都是基于设备树的&#xff0c;比如 ST 新出的 …

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址&#xff1a; 解压&#xff0c;配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错&#xff1a;ModuleNotFoundError: No module named extension…

后端查询出的数据库数字自动补零和不补零

select CAST(YTD_CHANGE*100 as decimal(18,1)), round(YTD_CHANGE*100,1) from RP where data_date 20211231补零 round(PYTD_CHANGE_PER*100,1)不补零 CAST(PYTD_CHANGE_PER*100 as decimal(18,1))

day39-Oracle分区表

0目录 Oracle分区表 1.2.3 1. Oracle分区表 1.1 作用&#xff1a; Oracle数据库的分区把表中的数据行按照分区划成几个区域&#xff0c;提高大数据量下表的性能 1.2 应用场景&#xff1a;常应用于数据量大的表 1.3 分类&#xff1a;Oracle中有范围分区&#xff08;最常见…

LCD-STM32液晶显示中英文-(5.字符编码)

目录 字符编码 字符编码说明参考网站 字符编码 ASCII编码 ASCII编码介绍 ASCII编码表 中文编码 1. GB2312标准 区位码 2. GBK编码 3. GB18030 各个标准的对比说明 4. Big5编码 字符编码 字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 …

代码随想录day6 | 1. 两数之和 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

文章目录 1. 两数之和2. 四数相加II3. 赎金信4. 三数之和5. 四数之和 1. 两数之和 1. 两数之和 虽然是LeetCode第一题&#xff0c;但是还是挺难的&#xff01; 模拟一下&#xff1a; class Solution { public:vector<int> twoSum(vector<int> &nums, int ta…

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…

美国某市政府出现重大数据泄露事件,疑似离职人员未删除权限

近日&#xff0c;美国得克萨斯州西部城市敖德萨市市长Javier Joven宣布&#xff0c;自2022年12月以来&#xff0c;已经有人多次使用前敖德萨市检察官Natasha Brooks的账户非法访问了该市的政府系统&#xff0c;并将大量敏感信息通过电子邮件转移到了一个私人账户&#xff0c;敖…