一个空类编译器默认产生4个函数:
默认构造函数、析构函数、拷贝构造函数、赋值函数。
这些函数都是public,且是内联函数。
以string类为例,为不引起重命名改为Mystring(也可以使用别的命名空间)
class Mystring
{
public:
Mystring(const char *str = NULL); //普通构造函数
Mystring(const Mystring &other); //拷贝构造函数
~Mystring(); //析构函数
Mystring &operator=(const Mystring &other); //赋值函数
private:
char *m_data;
};
/*实现*/
//普通构造函数
Mystring::Mystring(const char *str)
{
if (NULL == str) //当str为空时,赋值为空字符串
{
m_data = new char[1];
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length + 1]; //分配资源
strcpy(m_data,str); //复制内容
}
}
//拷贝构造函数
Mystring::Mystring(const Mystring &other)
{
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data,other.m_data);
}
//析构函数
Mystring::~Mystring()
{
delete []m_data;
}
//赋值函数
Mystring& Mystring::operator=(const Mystring &other)
{
if (this == &other) //是否是自我赋值
{
return *this;
}
delete []m_data; //释放原有资源
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data,other.m_data);
return *this; //返回本对象引用
}
该四个函数在什么时候调用?
class Mystring
{
public:
Mystring(const char *str = NULL) //普通构造函数
{
cout << "Mystring(const char *str) 普通构造函数" << endl;
}
Mystring(const Mystring &other) //拷贝构造函数
{
cout << "Mystring(const Mystring &other) 拷贝构造函数" << endl;
}
~Mystring() //析构函数
{
cout << "~Mystring()析构函数" << endl;
}
Mystring &operator=(const Mystring &other) //赋值函数
{
cout << "Mystring& operator=(const Mystring &other) 赋值函数" << endl;
return *this;
}
};
void main()
{
Mystring str1; //调用普通构造函数,此时str为空
Mystring str2("Hello Word");//调用普通构造函数
Mystring ste3 = "hello"; //调用普通构造函数
Mystring *str4 = new Mystring(); //调用普通构造函数
Mystring str5(str2); //调用拷贝构造函数
str1 = str2; //调用赋值函数
delete str4;
}
显示结果:
Mystring(constchar *str)普通构造函数
Mystring(constchar *str)普通构造函数
Mystring(constchar *str)普通构造函数
Mystring(constchar *str)普通构造函数
Mystring(constMystring &other)拷贝构造函数
Mystring&operator=(const Mystring &other) 赋值函数
~Mystring()析构函数
~Mystring()析构函数
~Mystring()析构函数
~Mystring()析构函数
~Mystring()析构函数