C和C++的区别

C和C++的区别主要有以下几点

1、C是面向过程的语言,而C++是面向对象的语言
2、C中的struct和C++的类,C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,使struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的是private
3、c++可以给参数带默认值,声明或定义只能有一处给默认值
4、c++支持inline内联函数
5、c++支持函数重载
6、c中的const是常变量,c++是常量
7、c++支持引用
8、c++申请堆区内存一般使用new,释放内存使用delete,c只能使用malloc,free

具体细节扩充:
1)面向对象的思想
在这里插入图片描述

4)Inline内联函数的特点、与普通函数和static修饰的函数的区别:
①Inline关键字修饰函数,编译阶段在函数的调用点直接代码展开,本文件可见,没有符号生成。
②Static 也是本文件可见,他修饰的函数是一个local的符号,普通函数是globle。
③内联函数没有开栈清栈的过程 static有。
④内联和宏的区别 宏是在预编译阶段处理,内联是在编译阶段处理。
⑤内联有安全检查类型检查而宏没有,内联是一种更高级的宏。
四个注意事项:
1、内联的实现不能写在原文件中,要写在头文件中
2、内联只在relese版本生效
3、内联只是一个建议,递归循环switch都不会被处理成内敛
4、内联是基于实现的,不是基于声明。要把它写在定义点
效率提高,但是是以代码膨胀为代价的,以空间换时间,当开栈的开销大于函数体执行的开销,要用内联;反之不用

5、函数重载(重定义),C++函数符号的生成规则
C++支持函数重载,而C不支持函数重载,而C++支持重载的依仗就在于C++的名字修饰与C不同,例如在C++中函数int fun(int ,int)经过名字修饰之后变为 _fun_int_int ,而C是
_fun,一般是这样的,所以C++才会支持不同的参数调用不同的函数。
C++的函数原型由函数的返回值,函数名,形参构成,形参的不同由形参的个数,类型,顺序的不同构成。
函数重载:是一种静多态,要求同名,不同参数,相同的作用域。与函数的返回值类型无关(因为在函数调用点看不到返回值的类型)。
bool Compare(int a, int b)
bool Compare(double a, double b)

6、Const:在c中的const修饰的是是常变量,在c++中修饰的是常量
①const修饰的变量一定要初始化,该变量不能做左值,也不能通过间接引用来访问
②是一个local的符号 要用extern来改成globle符号
③常变量一定要写在构造函数的初始化列表中
④常对象返回值是常量要用常指针来接收
⑤在C语言中const默认为外部连接,C++中const默认为内部连接

7)c++支持引用
引用和指针的区别:
①引用(内存单元的别名)一定要初始化(Linux下的汇编是从右往左看)
②引用和指针的底层实现是一样的,但只是底层引用接住了指针的特性,引用并不是指针
③引用不能引用不能取地址的数据
④引用不能改变,相同的引用只能给一个内存单元赋予
⑤引用变量只能使用引用变量所引用的数值 int&b = a b只能引用a的数值
⑥内置类型的时候一般写值传递,但是自定义类型的时候一般都写引用少两次函数调用一次构造一次析构,这样效率更高。

8、malloc/free和new/delete的区别
new是关键字 malloc是个函数
①申请的内存所在位置
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符申请的内存都在自由存储区。而堆操作系统的术语,是操作系统所维护的一块特殊内存,用于动态分配。自由存储区可以是堆可以是栈也可以在全局变量的.data区(取决于operate new实现方式)

②参数
使用new操作符申请内存分配时无需指定内存大小,编译器会根据类型信息自行计算,而malloc则需要指出内存大小。

③返回类型
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

④分配失败
new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

⑤是否调用构造/析构函数 (除了动态开辟内存还会初始化)
使用new操作符来分配对象内存时经历三个步骤:
a.调用operate new函数(数组用operate new[ ]),分配一块足够大的、原始的、未命名的内存空间以存储特定类型的对象。
b.编译器运行相应的构造函数以构造对象,并为其传入初值。
c.对象构造完成后,返回一个指向该对象的指针。
使用delete操作符来释放对象内存时会经历两个步骤:
a.调用对象的析构函数。
b.编译器调用operator delete(或operator delete[])函数释放内存空间。
而malloc不需要调用这些函数,malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作

⑥new可以开辟常量内存,但是melloc不行

⑦New可以调动melloc,但是melloc无法调动new(c–c++是向前兼容的)

⑧是否可以被重载
opeartor new /operator delete可以被重载。malloc/free不允许重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值