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

【小梦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++ 基础中的精华(二)_第1张图片

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

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

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

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

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

【小梦C嘎嘎——启航篇】C++ 基础中的精华(二)_第2张图片

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

你可能感兴趣的:(【小梦C嘎嘎——启航篇】,c语言,开发语言,c++)