C和C++区别

一、函数参数的默认值

C语言中没有函数参数默认值的概念、C++中函数参数可以有默认值

int fun(int a=10)在函数没有调用的时候,a自动赋值为10。

int fun(int a=10,int b)是不可以的,实参和形参自左向右匹配。

int fun(int a,int b=30)的时候,fun(20)传参数的时候为a=20,b=30。

int fun(int a=10,int b)虽然不可以,但是把int fun(int a,int b=30)放在后面是可以编译通过的,因为程序编译时根据其上文认为b的默认值为30,已经进行了压栈。

编译器函数的默认值就已经确定了,编译阶段看不到其他文件,所以函数默认值只在单文件有效。

注意*:

实参和形参匹配自左向右

函数默认值不能重复

一般放在声明上,因为函数的实现可能在调用后面,编译器可能看不到。

二、new和malloc的区别

new是C++中的关键,分配内存空间并进行初始化。

new和malloc区别

  1. new是关键字、malloc函数
  2. new在自由存储区、malloc在堆上
  3. new可以进行初始化、malloc只开辟内存
  4. new可以重载、malloc不能重载
  5. new可以调用malloc、malloc不能重写
  6. new可以开辟常量、malloc不可以

三、内联函数inline

内联函数inline是C++中的关键字。

内联函数在调用点直接展开来实现的,函数的参数压栈,减少由函数调用带来的开销,从而提高程序的运行效率。

inline只是对编译器的一个建议,不是所有的inline都处理成内联函数,递归就不能处理成内联函数,凡是带有while,for,switch的都不能处理成内联函数。

内联函数和宏的区别

(1)宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。宏定义在使用时只是简单的文本替换,并没有做严格的参数检查,内联函数会进行检查。

(2)它的返回值也不能被强制转换为可转换的合适的类型,它的使用就存在着一系列的隐患和局限性。

内联函数和static的区别

(1)inline函数没有开栈清栈开销、static有

(2)inline函数因为编译阶段代码展开导致本文件可见,static属性l为本文件可见

注意*:

inline一般写在头文件中

inline只在Release版本生效

inline只是给编译器一个建议

是基于实现、不是基于声明

以代码膨胀为代价,空间换时间

四、函数重载

函数重载三要素:函数名相同、参数列表不同、作用域相同。

静多态,编译时决定的多态。(同一接口、不同形态就是多态)

C语言函数符号的生成只和函数名有关,所以C语言同一文件不能用同名函数,所以C语言不能进行函数重载。

C++函数生成符号的规则:

?Sum@@YAHHH@Z(某函数生成的符号)

?Sum@@YANNN@Z(某函数生成的符号)

C++函数符号生成和函数原型有关:

(1)函数返回值

(2)函数名称

(3)函数的形参:形参个数、形参类型、形参顺序

不能用只用返回值类型重载函数,因为在调用点看不见函数返回值类型。

五、using namespace

为了解决变量和函数等的作用范围,在C++语言中引入了名空间的概念,并增加了关键字namespace和using。使用using namespace std之后,就省去了std::,可以直接引用std空间里面的函数和变量。

#include <conio.h>

#include <iostream.h>

namespace car // 名空间的定义

{

     void ShowLength(double len) // 参数类型为double

     {

     cout<<"in car namespace: "<<len<<endl;

     }

}

namespace plane // 名空间的定义

{

  void ShowLength(int len) // 参数类型为i n t

  {

cout<<"in plane namespace: "<<len<<endl;

  }

}

void main()

{

using namespace car;

   ShowLength(3);

   ShowLength(3.8);

   using namespace plane;

   ShowLength(93);

  ShowLength(93.75);

  getch();

}

同名的名字空间作用域会合并

六、const的使用

修饰变量

C语言中的const在编译阶段,常变量是否做左值,其他处理和变量是一样的。

C语言中const修饰全局变量和局部变量没有区别。

const int a;

int *p=&a;

*p = 20;//ok

C++中用const叫做常量,在编译阶段把用到常量的地方进行初始化。

C++中const修饰全局变量只在本文件可见,一定要要外部可见用extern关键字。

  1. 一定要初始化
  2. 不能做左值
  3. 不能间接修改,杜绝间接访问来修改常量内存的风险

const int a=10;

int* p=&a;//有修改的风险,报错//const int* p=&a这是可以的

修饰函数

修饰对象:常对象的成员都是常属性,不能修改,常对象不能调用普通方法

七、引用

引用就是给变量起别名int  &a=b;

  1. 一定要初始化
  2. 引用只能引用可以取地址的数据
  3. 引用不可以改变
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值