2-13 特殊运算符重载及注意点
一、赋值运算符 = 重载
将⼀个对象赋值给另⼀个对象的时候
**,会调⽤赋值运算符重载函数 **
String str1;
String str2 = str1;//String str2(str1)调⽤拷⻉构造函数
str2 = str1;//调⽤赋值运算符重载函数
注意:
- 如果没有⼿动添加它,编译器会提供⼀个默认的赋值运算符重载函数
- C++ 强制规定,赋值运算符重载函数只能定义为类的成员函数
String& String::operator=(const String &other)
{
if(this == &other){
return *this;
}
if(m_data != NULL){
delete[] m_data;
}
if(other.m_data != NULL){
m_data = new char[strlen(other.m_data) + 1];
strcpy(m_data,other.m_data);
}else{
m_data = other.m_data;//NULL
}
return *this;
}
二、左移运算符<<重载
/*
String Str;
str << "ab" << "cd" << "123";
str.show();//"abcd123"
*/
String & String::operator<<(const char *str)
{
int len = 0;
char *oldStr = NULL;
if(!str){
return *this;
}
if(this->str){
len = strlen(this->str) + 1;
oldStr = this->str;
}
len += strlen(str);
this->str = new char[len];
if(oldStr){
strcpy(this->str,oldStr);
delete[] oldStr;
}else{
this->str[0] = '\0';
}
strcat(this->str,str);
return *this;
}
三、不能被重载的运算符
⼤部分运算符都可以重载,以下运算符不能重载

四、注意点
- C++ 中⼤部分运算符都可以重载,只有⼀⼩部分不可以重载,其中 "=“和”&" 不重载,编译器 默认⽀持
- 重载运算符限制在 C++ 语⾔中已有的运算符范围内进⾏重载,不能创建新的运算符
- 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法 结构
- 重载运算符函数不能有默认的参数,否则就改变了