C和C++的区别
首先我们先简单介绍一下C语言和C++:
①:C语言的介绍
- C语言是一个结构化语言,它的重点在于算法和数据结构。C语言的设计首要考虑的是如果通过一个过程对输入进行运算处理得到输出。
- C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。
- C语言是非常有效率的,作为一个底层编译语言,可以通过指针直接去对内存进行管理,另外很多语言都是用C语言来设计的,如java,python。
②:C++的介绍
- C++是对C语言的继承与发展,C++功能很强大,可以应用开发大型应用软件。即可以面对对象,也可以兼容C语言面对过程。
- C++是一种复杂,难以掌握的语言,不仅仅体现在语法上,更体现在四种编程思维模型上。由此C++是既有效率,又有弹性;既面对对象,又可以面对过程。
- C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计,数据抽象,面对对象程序设计,泛型程序设计等多种程序设计风格。
下面我们简述C和C++有什么不同:
- C语言是面对过程的,而C++是面对对象的。
- C和C++都有结构的概念,但是在C语言中结构只有成员变量,没有成员方法,而在C++结构中,它可以有自己的成员变量以及成员方法。
- C语言中结构的成员是默认是公共的,而在C++中没有加限定符则默认是私有的。
- C++中有bool类型,而C语言可没有bool类型,均为数值类型
- const关键字要注意一点不同就是C++的类函数,类函数声明时可以用const,表示这个函数没有改变类中的任何属性。例如:void func()const; ,而C语言中则不可以。
现在该重头戏了,我们将详细介绍C和C++的区别:
①:函数的默认值
C++可以给函数声明或定义时赋初值,而C89标准是不可以的。
那么函数声明或定义时给函数的默认值有什么好处呢?
比如:我们写了一个简单的加法函数调用(没有带默认值):
我们转到反汇编去看看:
我们可以发现,先分别开辟空间依次保存10和20,然后sum函数调用的时候,压栈了20,又压栈了10,然后调用call命令(1.先将下一行指令地址压栈 2.jump到sum函数内)。
我们对这个函数做一点点修改(加上默认值):
我们再转到反汇编去看看:
我们会发现,系统只用开辟空间保存10,而在sum函数调用的时候的只压栈了10,相比于上面不带默认值的函数,它会将20这个默认值当作立即数压入,提高了效率。
那么函数的默认值这么好用,有没有什么限制呢?
答案是有的,比如:
- 默认值一般写在声明中
- 默认值的传值方式是 自右向左 依次赋值
- 默认值赋值只能赋一次
- 默认值可以使用全局变量,甚至是一个函数,但是不能是局部变量,因为默认值是要在编译阶段确定的,而局部变量的位置与值在编译阶段是无法确定的。
- 默认值可以多次声明依次自右向左给,但不能跳着给,比如这样是可以的:
但是不能这样给:
/*如果这里要详细了解函数默认值的话,直接看我之前写的博客即可:
https://blog.youkuaiyun.com/IT_Quanwudi/article/details/84504685*/
②:函数重载
重载函数是函数的一种特殊情况,C语言中的函数不能重名,同名函数会出现重定义。
但是为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的参数列表(指参数的个数、类型或者顺序)必须不同,也就是说同名函数完成不同的运算功能,这就是重载函数。
重载函数常用来实现功能类似而所处理的数据类型不同的问题。但不能只有函数返回值类型不同。
函数重载三要素:
- 同作用域下才能重载
- 同名函数
- 参数列表不同
函数重载的注意事项:
- 函数名相同,参数列表相同,只用返回值不同,不能构成函数重载
- 一个函数不能即作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少些一个参数,系统无法判断是使用少一个参数的重载函数还是使用利用默认值的函数,这就出现了二义性,系统只能报错。
现在,我们来看一下函数重载的限制:
1. 仅返回值不同,函数无法重载