请问创建动态对象,重载new时为什么要做类型转换(见下列代码注释)
#include <iostream>
#include <cstring>
using namespace std;
class String
{
int length;
char *Strp;
public:
void * operator new(size_t size);
void * operator new(size_t size, char *str);
void * operator new(size_t size, String &s);
void print()
{
cout << "string = " << Strp << endl;
cout << "length = " << length << endl;
}
void operator delete(void *p)
{
if(p)
{
String *t = (String *) p;
if(t -> Strp)
delete [](t->Strp);
delete [](char *) p;
}
cout << "Delete" << endl;
}
};
void * String::operator new(size_t size)
{
String *p = (String *)new char[size]; //为什么要先new一个字符数组然后再做类型转换?
p -> length = 0;
p -> Strp = new char[p -> length + 1];
*(p -> Strp) = '\0';
cout << "New 1\n";
return (void *)p;
}
void * String::operator new(size_t size, char *str)
{
String *p = (String *)new char[size];
p -> length = strlen(str);
p -> Strp = new char[p -> length + 1];
strcpy(p -> Strp, str);
cout << "New 2\n";
return (void *)p;
}
void * String::operator new(size_t size, String &s)
{
String *p = (String *)new char[size];
p -> length = s.length;
p -> Strp = new char[(p -> length) + 1];
strcpy(p -> Strp, s.Strp);
cout << "New 3\n";
return (void *)p;
}
int main()
{
String *ptr1, *ptr2, *ptr3;
ptr1 = new String;
ptr2 = new ("student")String;
ptr3 = new (*ptr2)String;
ptr1 -> print();
ptr2 -> print();
ptr3 -> print();
delete ptr1;
delete ptr2;
delete ptr3;
return 0;
}
String *p = (String *)new char[size];
new char[size]; 的类型是 char *
char *的变量用String *接收,它们不兼容就需要转换。
什么情况下不需要转换:
左边的类型和右边的类型相同
左边的类型是右边类型的基类
实现了隐式类型转换运算符
C++的内置类型,并且满足一定的关系,比如float->double,short->int