一、C与C++数据类型的区别
1、C++的结构
1)不再需要 typedef,再定义结构变量时,可以省略struct关键字。
2)成员可以是函数,在成员函数中可以直接访问结构成员,不再需要.或者->,但必须通过结构变量 或结构指针才能调用成员函数。
3)有一些隐藏的成员函数(构造、析构、拷贝构造,复制构造)。
4)可以被继承,可以设置成员的访问权限(面向对象)。
2、C++的联合
1)不再需要 typedef,可以省略 union 关键字。
2)和结构一样。
3)有隐藏的成员函数。
3、C++的枚举
1)不再需要 typedef,可以省略 enum 关键字。
2)使用方法与C一致,但是类型检查更严格,整形变量不能给枚举变量赋值。
4、C++布尔类型
1)C++中有真正的布尔类型,bool、true、false 在C++中是关键字。
2)true、false 在C++中占一个字节,而在C中占4个字节,因为在C中他们是宏(用0,1替换)。
5、C++中的void*
1)C语言中void* 可以与任意类型的指针自动转换(万能指针)。
2)C++中void* 类型的指针不能给其他类型的指针变量赋值,但是其他类型的指针可以给void*赋值
(为了兼容C语言)
void *p;
int* p1 = p; // error
p = p1; // ok
int* ptr = (int*)malloc(4);
C++为什么修改void* ?
为了更安全,C++的类型检查阉割。
C++可以自动识别数据类型(类型重载、模板),对于万能指针的需求不再强烈。
6、C++中的字符串
1)C++中字符串被封装成了string类,也转换成C语言中的字符串。
2)需要包含string头文件,但已经包含在iostream头文件中,属于std名字空间。
3)常见的字符串操作不再需要函数,可以直接使用运算符。
例如strcpy函数可直接用=号
二、C++的内存管理
1、new/delete 分配/释放堆内存的运算符
功能相当于C语言中的malloc/free new 类型;//会自动计算字节数,然后从堆中分配相应的内幕才能,然后返回一个带类型的指针。
delete 指针;//释放堆内存
new/delete 会自动调用类型中关键的函数。
注意:不能与C语言中的malloc/free混用。
2、new[]/delete[];
newp 类型[n];用于为数组分配长度,通过n表示数组长度,如果是类,结构体会自动调用n次构造函数。
delete[]指针:专门释放数组内存,会调用n次构造函数,如果错用delete后果不确定。
new[] 所申请的内存的前4个字节,存储着数组的长度(仅限于自定义类型)。
3、new/delete可能产生错误
1)new/new[]分配内存失败时不会返回NULL指针,而是跑出异常bad_alloc,如果不处理程序就会结束。
2)delete/delete[] 不能重复释放,否则会产生错误
3)delete/delete[] 释放野指针后果不确定,释放空指针是安全的。
malloc/free与new/delete的比较
不同点 | malloc/free | new/delete |
---|---|---|
身份 | 函数 | 运算符 |
参数 | 字节数 | 类型 |
返回值 | void* | 带指针类型的地址 |
返回值 | void* | 带指针类型的地址 |
析构/构造 | 不调用 | 自动调用 |
错误 | 返回NULL | 抛异常 |
相同点:
1)管理堆内存。
2)不能重复释放。
3)可以释放空指针。