【小梦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嘎嘎的基础知识。希望大家通过阅读此文有所收获!
😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘