赋值运算符只能作为成员函数重载,不能作为普通函数;
可以直接使用=在两个同类型的对象进行逐个字节的复制,但是赋值的对象可能不是同一类型。
重载赋值运算符的意义--浅复制和深复制
浅拷贝:逐个字节的复制工作,即指针值也发生了改变,指向同一块内存区域,原先的内存泄漏,同一块内存会释放两次
深拷贝 :新的一块内存区域中存放相同的值
#include <iostream>
#include <cstring>
using namespace std;
class String
{
private:
char *str;
public:
String():str(0){}
const char* c_str(){return str;}
char *operator=(const char*s);
String &operator=(const String & s);
~String();
};
char * String::operator=(const char*s)
{
//字符串复制给String对象
if (str)
delete[] str;
str = new char[strlen(s) + 1];
strcpy(str, s);
return str;
}
String & String::operator=(const String & s)
{
//深复制
if (str == s.str) return *this; //s 中的 str和str指向同一块内存区域
if (str)
delete[] str;
if (s.str)
{str = new char[strlen(s.str) + 1]; //两块内存区域
strcpy(str, s.str);}
else
str = NULL;
return *this; //return String
}
String::~String()
{
if (str) delete[] str;
}
int main()
{
/**assign char * to String*/
String s1; //定义一个对象,调用无参构造函数
s1 = "jinruoyan"; //赋值运算符的使用
cout << s1.c_str() << endl;
/**this aims to ini using constructor not assignment*/
//String s2 = "jinruoyan"; //初始化工作,需要调用String(char *)的构造函数
/**this aims to use shen assignment*/
String s3;
s3 = s1;
cout << s3.c_str() << endl;
String s4;
s4 = "hello world"; //assign char * to String obj
s4 = s4; //assign char * to String
cout << s4.c_str() << endl;
String s5(s4); //调用默认的复制构造函数,是浅拷贝,应该自己定义深拷贝
}