c与c++的不同

                            c与c++的区别

1.调用约定的不同

c函数采用c调用约定c++采用thiscall调用约定,这导致了c++成员函数调用的时候会多产生一个this指针。并且他在数字签名上也对于其产生了很大的不同。c的函数fun(int a)在符号表中为_fun(),而c++为fun(int)加入了形参类型,这也是静多态重载会发生的最大原因。

2.带默认值的函数
c99c++含有这个 c89(c语言)不支持
*默认值给的顺序(右向左)效率汇编上会有提高相对于不带默认值的函数。

*可以声明处给默认值定义处不给。

3.inline(编译阶段调用点展开代码,inline只作用于relase版本)
*减少了普通调用的栈 开销,简短代码尽量用内敛函数(写在头文件里面)
它符号表不产生符号,意味着展开代码并不是定义,所以它可以写在头文件,而普通文件不可以会有重定义。
*inline本文件可见,其他文件使用要记得添加头文件。
与static区别
*开辟栈否。。

*符号表中链接只处理全局global不处理local(objdump -t main.o查看符号表)

4.const
*const在c中是常变量,在c++中是常量。常变量意味不能为左值,常量就是在编译阶段就要替换所有常量名为初始值。
因此const在c++中要赋予初始值,否则编译时候没有替换对象。
*退化问题, int b=20,const int a=b;a就退化成常变量。(因为编译阶段不知道b是多少所以就不能做替换,默认退化)
*extern const int a=20(定义处exturn就可以外部可见)如果我们在c的各个文件中写这个会导致重定义。但是在c++

中就可以。

5.引用(可以理解为引用对象的别名)
* int (&arry) [10]作为形参传入参数sizeof后会是40,引用是别名不会造成数组退化。

*引用必须初始化,引用不能改变指向,引用初始化右值必须可以取地址。(当然改变指向检查在编译阶段,其他手段亦可以改变指向)

6.动态内存开辟
malloc与free new  delete
*语法区别
*普通new开辟失败抛出异常 但是new (nothrow) int(10)是不抛出异常的new 还有new const int(4)常量new和
定位new  new(p) int(10);因为我们new开辟int不写值可以只开空间,alloctor会用到。实现开辟赋值分离。
 ,malloc返回NULL


猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/80748995