本篇博客讲述c.c++的八大区别
一、函数重载
* 在c中,函数名相同的俩个函数,没有函数重载,编译器会报错。
* 但在c++中,函数会重载,依赖函数的原型,有三个要素:
1.函数名相同 重载的前提函数名应该相同
2.参数列表不同 函数的参数类型 ,个数,顺序不同
3.处于同一作用域
而函数原型的函数符号生成规则:
返回值+函数名+参数列表
例如 int Add(int,int) 生成的函数符号为: ?Add@@YAHHH@Z
二、const
在c中,const修饰的值为常变量,不能做左值,其他与正常的变量一样
在c++中,const修饰的值为常量,值不允许改变。在编译期,在常量出现的地方直接替换成了初始化的值。
c++中:
1.const修饰的值一定要初始化
2.不能有修改常量内存块的风险
3.const修饰的全局变量的符号是一个local
4.用变量初始化常量,常量会退化成常变量。
extern const修饰的全局变量的符号声明成global
三、引用 、指针
引用 自带解引用,相当于变量(内存单元)的别名,底层是用指针来实现的。引用是带类型的,不带类型是取地址符
1.引用一定要初始化,不然访问不到
2.引用引用的对象一定要能取地址(例如那个值不能是一个数值,int &a=10)
3.引用不可改变 例如 不能int&a= b;然后int & a=c; 一个名字只能用一次。
4.引用只能访问所引用的变量的内存块里内容。 例如 int c =10;int& a=c; a自带解引用 ,使用时直接就是a的值
四、malloc、new的区别
1. malloc是一个函数,new是一个关键字
2.malloc在堆上,new是自主存储区域。
3.malloc不能调用new,new可以调用malloc。
4.malloc只开辟空间,而new还自动初始化
5.返回值不同,当失败时,malloc返回空,new抛出异常
6.malloc不能重载,new可以重载
7.malloc不能开辟常量内存,new可以
五、inline(内联函数),static 宏函数
1.内联函数在调用点展开
2.不一定都会展开,只是对编译器的建议,比如说递归,循环,switch就不会,因为函数展开是在编译期间,此时并不知道函数参数的值,所以无法获取具体展开的次数
3.优点是能提高效率,缺点是代码膨胀(在每个调用点都生成指令,会变异很多份),以空间换取时间。
4.内联函数写在头文件中,因为需要不同的.cpp文件调用,如果放在.cpp文件中,其他.cpp文件不能使用
5.当函数的栈帧开辟开销大于函数的执行开销,就使用内联函数,否则不用
6.只在release版本生效
7.基于实现,在定义点使用,不在声明中使用
8.inline函数与宏函数相比有类型检查。与static相比都在本文件中可见,但是inline没有栈帧开辟和清理的开销,static有,而且inline不产生符号,static产生符号。
六、函数的默认值(只能在同一作用域)
在c++中可,c不可
1.必须从右到左依次赋值,不能跳过
2.不能重复赋值,只能赋一次
3.一般在声明上给出默认值。
七、c c++的相互调用
c调用c++
1.c++能修改
.cpp中加入extern“c”
2.c++不能修改
添加中间层
八、名字空间作用域
using namespace std;
指示符 空间 作用域名
namespace cy1201 就是将本文件命名为cy1201
using namespace cy1201 就是用cy1201 下的所有内容
cy1201::a