本质是按需使用C语言中的malloc和delete函数
重载new关键字
代码示例如下:
void* operator new(size_t size)
{
cout << "这里是内存分配中!!" << endl;
void *p= malloc(size);
cout << "申请到的内存为"<< p << endl;
return p;
}
size_t参数本质是unsigned long long的别名
重载delete关键字
void operator delete(void* p)
{
cout << "释放内存中!!" << endl;
if (p == 0)
return;
else
free(p);
}
主函数中调用结果:
int main()
{
//重载new 和delete 关键字
int* p = new int(3);
cout << "p=" << p << ", *p=" << *p << endl;
delete p;
}
运行结果:
类型转换(使用构造函数:基础数据类型->类对象)------转换函数(实际开发中较少使用,类对象->基础数据类型)
使用explicit关键字的话就必须要显示转换,不能隐式转换
class girl
{
private :
int num_;
double score_;
char sex_;
public:
girl(int num) : num_(num) {
score_ = 8.0;
sex_ ='X'; //0这里等同于"\0",即空字符
cout << "这里是构造函数 num自动转换" << endl;
}
explicit girl(double score) : score_(score) {
num_ = 0;
sex_ = 0; //这里等同于"\0",即空字符
cout << "这里是构造函数 double自动转换" << endl;
}
void show()
{
cout << "编号:" << num_ << ", 分数:" << score_<<",性别:"<<sex_ << endl;
}
//转换函数,从类对象到基础数据类型的转换
explicit operator int()
{
return num_;
}
operator double()
{
return score_;
}
operator char()
{
return sex_;
}
};
int main()
{
girl g1(3);
g1.show();
int num =(int) g1; //这里必须显式转换,不然会出现异常值
cout << "num=" << num << endl;
double score = g1;
cout << "score=" << score << endl;
char sex = g1;
cout << "sex= " <<sex << endl;
cout <<( int) g1<<", " <<(double) g1<<", " << (char)g1 << endl; //这里直接进行类的类型转换
}