#include <iostream>
#include <string>
using namespace std;
class String
{
public :
String(const char *str=NULL);//普通构造函数
String(const String &str);//复制构造函数
~String(void);//析构函数
String & operator =(const String &str);//赋值函数
private:
char *Mystr;
};
String::String(const char *str)
{
cout<<"constructing"<<endl;
if(Mystr==NULL)
{
Mystr=new char[1];
Mystr='\0';
}
else
{
Mystr=new char[1+strlen(str)];
strcpy(Mystr,str);
}
}
String::String(const String &str)
{
cout<<"constructing copy"<<endl;
Mystr=new char[1+strlen(str.Mystr)];
strcpy(Mystr,str.Mystr);
{
cout<<"operator function"<<endl;
if(this == &str)
{
return *this;
}
else
{
delete []Mystr;
Mystr=new char[1+strlen(str.Mystr)];
strcpy(Mystr,str.Mystr);
}
return *this;
}
String::~String()
{
cout<<"deconstructing"<<endl;
}
int main()
{
String a("hello");
String b("world");
String c(a);
c=b;
String d=b;//这里是复制构造函数,不是赋值函数!!!
return 0;
}
#include <string>
using namespace std;
class String
{
public :
String(const char *str=NULL);//普通构造函数
String(const String &str);//复制构造函数
~String(void);//析构函数
String & operator =(const String &str);//赋值函数
private:
char *Mystr;
};
String::String(const char *str)
{
cout<<"constructing"<<endl;
if(Mystr==NULL)
{
Mystr=new char[1];
Mystr='\0';
}
else
{
Mystr=new char[1+strlen(str)];
strcpy(Mystr,str);
}
}
String::String(const String &str)
{
cout<<"constructing copy"<<endl;
Mystr=new char[1+strlen(str.Mystr)];
strcpy(Mystr,str.Mystr);
}
/*
通过这个赋值函数和复制构造函数的对比,我们可以看到其中的区别:
(1) 复制构造是一个对象来初始化一块内存区域,这块内存就是新对象的内存区
(2) 实现不一样,复制构造函数首先是一个构造函数,它调用的时候是通过参数
来的对象来初始化一个对象;而赋值函数是把一个对象赋值给另一个原有的对象(注意原有两个字)
先判断是不是同一对象,若是同一对象,直接返回原对象即可。否则先把原来对象的内存释放掉,然后
重新分配内存,赋值。
*/
String & String::operator =(const String &str){
cout<<"operator function"<<endl;
if(this == &str)
{
return *this;
}
else
{
delete []Mystr;
Mystr=new char[1+strlen(str.Mystr)];
strcpy(Mystr,str.Mystr);
}
return *this;
}
String::~String()
{
cout<<"deconstructing"<<endl;
}
int main()
{
String a("hello");
String b("world");
String c(a);
c=b;
String d=b;//这里是复制构造函数,不是赋值函数!!!
return 0;
}