1、C++中的类型转换
static_cast <type> (expression) 静态转换
const_cast <type> (expression) 常量转换
reinterpret_cast <type> (expression) 重解释转换
dynamic_cast <type> (expression) 动态转换
说明:
type 目标类型名
expression 待转换的表达式
static_cast
用于基本类型之间的转换,如int和double, int和char
例:
double d = 3.14;
int a = static_cast<int>(d);
char c = static_cast<char>(a);
用于int与enum之间的转换
例:
enum Color {RED, GREEN, BLUE};
Color color = GREEN;
cout << static_cast<int>(color) << endl;
用于void*与其他*之间的转换
例:
int* p = static_cast<int*>(malloc(4));
*p = 100;
const_cast
用于移除指针或引用的底层const
例:
const char* p = "hello world";
char* p1 = const_cast<char*>(p);
p1[0] = 'H'; // 从语法角度,可以通过p修改它指向的对象,但结果未知。
const int a = 100; // 顶层const, 无法移除
int* p = const_cast<int*>(&a);
*p = 200;
a == 100;
reinterpret_cast
用于任意类型指针之间的转换,用于整数与指针之间的转换
例:
double d = 3.14;
int*p = reinterpret_cast<int*>(&d);
*p = 4.14;
double *d1 = reinterpret_cast<double*>(p);
cout << *d1 << endl;
已知一个地址,为0xff7788, 往这个地址中写一个整数值100
int* p = reinterpret_cast<int*>(0xff7788);
*p = 100;
dynamic_cast
用于多态类型之间的转换。
2、动态内存 new/delete
new和delete是C++中的运算符
new 用来在堆空间中动态分配内存
delete 用来释放动态内存
语法格式:
类名* 指针名 = new 类名; // 在堆空间中实例化一个对象
类名* 指针名 = new 类名(初始值); // 在堆空间中实例化一个对象,同时初始化
类名* 指针名 = new 类名[元素个数]; // 在堆空间中实例化一个对象数组delete 指针名; // 释放单个对象
delete [] 指针名; // 释放一组对象
例:
int* p1 = new int; // 分配4字节空间,返回首地址
int* p2 = new int(100); // 分配4字节空间,返回首地址, 同时初始化
int* p3 = new int[5]; // 分配了5个整数那么大的空间,返回数组首地址
delete p1;
delete p2;
delete [] p3;
Point* p4 = new Point; // 实例化一个Point类型的对象,调用默认构造函数
Point* p5 = new Point(100, 200); // 实例化一个Point类型的对象,同时初始化
delete p4;
delete [] p5;
特性:
new能根据类型自动计算所需要的空间大小
new返回的不是void*, 而是对应类型的指针。
new在分配空间时,还能同时初始化。
new失败时,抛出异常: bad_alloc
new在实例化对象时,会自动调用构造函数。(*)
delete 在销毁对象时,会自动调用析构函数。(*)
3、析构函数
功能:用于销毁对象时清理对象所占用的资源
特点:
名称与类名相似,由波浪线+类名组成
~类名
没有返回类型,且没有参数(不能重载、不能设置默认值)
当销毁对象时,自动调用
如果没有显式的定义析构函数,编译器会自动生成。
~类名() {}