class String
{
public:
String(const char *str = NULL);
~String();
String(const String &other);
String &operator = (const String &other);
private:
char *data;
};
String::String(const char *str)
{
if(NULL == str)
{
data = new char[1];
*data = '\0';
}
else
{
int len = strlen(str);
data = new char[len+1];
strcpy(data,str);
}
}
String::~String()
{
delete []data;
}
String::String(const String&other)
{
int len = strlen(other.data);
data = new char[len+1];
strcpy(data,other.data);
}
String &String::operator = (const String &other)
{
if(this == &other)
{
return *this;
}
delete []data;
int len = strlen(other.data);
data = new char[len+1];
strcpy(data,other.data);
return *this;
}
拷贝构造函数的作用:
a.利用已有的对象显示或者隐式生成一个新对象
b.复制一个对象,将它作为实参传给一个函数
c.从函数返回时复制一个对象
d.初始化顺序容器中的元素
e.显示初始化(利用数组的初始化列表)数组元素
对象间的赋值会调用拷贝构造函数,如果拷贝构造函数的形参不是对象的引用而是对象本身调用时会发生什么?
String(const String other)是值传递主调函数[ String t2(t1) ]会把实参的副本传递给形参,那么实参的副本是怎么来的呢?当然还是调用拷贝构造函数生成的,但是调用拷贝构造函数生成副本的过程中,又会调用拷贝构造函数,这样,拷贝构造函数会一直递归调用,直到消耗尽栈空间,最后程序崩溃。