C与C++的不同点
首先声明一下我这里的不同点不是那些C有C++没有或者C++有而C没有的,而是一些都有的内容的不同的存在意义
1.内存管理
new/delete 是C++中具备申请释放内存功能的运算符,功能相当于C中的malloc和free。
new类型:会自动计算类型所需要字节数,然后从堆分配对应字节数的内存,并返回内存的首地址(具备类型)。
delete类型:delete 指针:会自动释放堆内存
注意:new/delete 和malloc/free不能混用,因为在new和delete会自动调用类、结构的构造函数和析构函数,但其实new和delete的底层还是调用了malloc和free。
下面用一张表格来总结一下:
特征 | new/delete | malloc/free |
---|
本质 | 运算符 | 标准库函数 |
参数 | 类型 | 字节数 |
构成调用 | 自动调用 | 不调用 |
分配内存大小 | 自动计算 | 手动计算 |
返回值 | 完成类型指针 | void*类型指针 |
分配内存失败 | 抛出异常 | NULL |
2.static关键字
C语言中static 关键字
- 修饰函数名时,称为静态函数,只允许该文件在源文件中调用,不能被其他文件所调用
- 修饰局部变量时,称为静态局部变量,该变量只能在局部函数内,但出了作用域也不会释放。
- 修饰全局变量时,称为静态全局变量,该变量只能在该文件中调用,出了该文件不能被调用
简单的来说static的作用在C语言中可以分为隐藏和增加变量的内容的持久性
C++中static关键字
保留了C文件的功能,增加了一些C++的独有功能,可以修饰类的成员变量和成员函数,形成静态成员和静态成员函数。
3.const关键字
首先C/C++中const都是一种修饰符,表示具有只读属性,一旦我们尝试去修改这些被修饰的变量或者代码时,编译器就会给我们报错,因此可以用来给我进行报错。
C语言中const的使用一些规则:
- 被const修饰的变量可以初始化,也可以不初始化
- 被修饰的量不能被当做常量来使用,而是一种常变量,简单来说还是一种变量只是带了常属性,不能真的当做一个比如数组的长度来理解
- 被const修饰的变量不能用于左值,就是不能被修改,因为是具有只读属性
- 常变量的编译模式和普通变量时一样的
C++语言中const的一些使用:
- 被const修饰的一定要初始化
- 被const修饰的变量可以被当做常量使用
- 被const修的变量也可以变为常变量
- 编译模式,若在编译时立即给出立即数,则变为常量,否则则是常变量
代码例子:
const int a= 20;
int b = 20;
const int a= b;
- 由于C++对于类型的检查会很严格所以在函数的传参时,若直接以字面值传输在函数的参数表要加const,因为字面值具有常属性
- 在类中可以作为常函数,const是给this指针加的,在常函数内不能修改成员变量的值,普通的成员函数可以调用常函数,而常函数只能调用常函数,如果真的需要在常函数中修改某个成员变量的值,则需要在该成员变量前加mutable修饰符
class A
{
public:
void show(void) const
{
}
}
- 常引用,在无名引用时必须使用无名引用或者在引用临时变量
const int& b = 20;
const int& c = 10+20;
4.void*
C语言中 void* 可以与任意类型进行转换
而C++中必须进行强制类型转换才能给其他类型进行赋值,而其他类型可以给void*类型进行自动赋值
因为C++可以自动获取类型所以对于万能指针的需求不是很大。