类对象的赋值运算符重载函数
示例:
#include <iostream>
using namespace std;
class Test{
public:
Test():n(0),m(0){}
Test(int n,int m):n(n),m(m){}
Test& operator=(const Test& t){ //赋值运算符重载,覆盖掉编译器默认的对象间的赋值
cout << this << " operater=" <<endl;
n = t.n; //拷贝成员内容
m = t.m;
return *this; //必须要有一个返回值,否则会报错
}
void Print(){
cout << this << ":" << n << "." << m << endl;
}
private:
int n;
int m;
};
int main(){
Test t(100,150);
t.Print();
Test s;
s.Print();
s=t; //这里的等号已经变成一种函数,该语句等价于s.operater(t);
s.Print();
}
一般情况下,编译器会自带对象之间赋值功能,没必要赋值运算符重载,该例子是为了演示。除非对象成员含有指针类型,为防止二次释放内存,从而导致内存泄露,所以要进行深拷贝。
示例二:
#include <iostream>
#include <cstring>
using namespace std;
class String{
private:
char *str;
public:
String():str(NULL){}; //定义默认构造函数
String(const char* s){ //定义带参数的构造函数
str = new char[strlen(s)+1];
strcpy(str,s);
}
String(const String& s){ //定义拷贝构造函数
if(NULL==s.str)
{str = NULL;}
else {
str = new char[strlen(s.str)]; //深拷贝
strcpy(str, s.str);
}
}
String& operator=(const String& s){ //定义赋值符号重载函数
if(&s == this) //避免自我赋值,否则底下的if语句会删掉自身原来所存储的信息
return *this;
if(str != NULL) //删除原来申请的空间
delete [] str;
if(NULL == s.str) //如果原来对象为空,则设置为空
str = NULL;
else{
str = new char[strlen(s.str)+1]; //深拷贝
strcpy(str,s.str);
}
return *this; //返回对象
}
void Print(){
cout<<this<<endl;
}
};
int main(){
String str1; //调用默认构造函数
str1.Print();
String str2("Hello"); //调用带参构造函数
str2.Print();
String str3(str2); //调用拷贝构造函数
str3.Print();
str1 = str2; //调用赋值符号重载函数
str1.Print();
str2 = str2; //测试自我赋值
str2.Print();
}
注意区别:
类名 对象2 = 对象1; // 会触发调用 拷贝构造函数
对象2 = 对象1; // 会触发调用 赋值运算符重载函数
深拷贝和浅拷贝