其它操作符重载和限制
下标操作符
•常用于在容器类型中以下标方式获取数据元素
•非常容器的元素为左值,常容器的元素为右值
函数操作符
一.函数操作符
•如果一个类重载了函数操作符,那么该类的对象就可以被当做函数来调用,其参数和返回值就是函数操作符函数的参数和返回值
•参数的个数、类型以及返回值的类型,没有限制
•唯一可以带有缺省参数的操作符函数
解引用和间接成员访问
一.解引用和间接成员访问操作符
•如果一个类重载了解引用和间接成员访问操作符,那么该类的对象就可以被当做指针来使用
自定义类型转换
一.自定义类型转换
•通过构造函数实现自定义类型转换
–class Integer
{
[explicit] Integer (int const& data) : m_data (data) {}
};
–“explicit”关键字可将这种类型转换强制为显式类型转换
•通过类型转换操作符函数实现自定义类型转换
–class Integer
{
[explicit] operator int (void) const
{
return m_data;
}
};
–“explicit”关键字可将这种类型转换强制为显式类型转换,但需要编译器支持C++11标准
•源类型是基本类型,只能通过构造函数实现自定义类型转换
•目标类型是基本类型,只能通过类型转换操作符函数实现自定义类型转换
•源类型和目标类型都不是基本类型,既可以通过构造函数也可以通过类型转换操作符函数实现自定义类型转换,
但不要两者同时使用,引发歧义
•源类型和目标类型都是基本类型,则无法实现自定义类型转换,基本类型间的类型转换规则完全由编译器内置
对象创建操作符
•如果一个类重载了new/new[]操作符,那么当通过new/new[]创建该类的对象/对象数组时,
将首先调用该操作符函数分配内存,然后再调用该类的构造函数
–class Dummy
{
static void* operator new (size_t size) { … }
static void* operator new[] (size_t size) { … }
};
•包含自定义析构函数的类,通过new[]创建对象数组,所分配的内存会在低地址部分预留出sizeof(size_t)个字节,存放数组长度
•使用new/new[]操作符的形式代码
对象销毁操作符
•如果一个类重载了delete/delete[]操作符,那么当通过delete/delete[]销毁该类的对象/对象数组时,
将首先调用该类的析构函数,然后再调用该操作符函数释放内存
–class Dummy
{
static void operator delete (void* p) { … }
static void operator delete[] (void* p) { … }
};
•包含自定义析构函数的类,通过delete[]销毁对象数组,会根据低地址部分预存的数组长度,
从高地址到低地址依次对每个数组元素调用析构函数
•使用delete/delete[]操作符的形式代码