赋值运算符的重载
赋值运算符 ‘=’ 重载
-
赋值运算符 两边的类型 可以 不匹配
- 把一个 int类型变量 赋值给一个 Complex对象
- 把一个 char * 类型的字符串 赋值给一个 字符串对象
- 需要 重载赋值运算符 ‘=’
- 赋值运算符 “=” 只能重载为 成员函数
编写一个长度可变的字符串类String
-
包含一个char * 类型的成员变量
- 指向动态分配的存储空间
- 该存储空间用于存放 ‘0’ 结尾的字符串
string s = "hello"; // =是初始化语句
string s;
s = "hello"; //赋值语句
s1 = s2:拷贝
- 浅拷贝 : 复制地址给s1的str,缺点是共用一块内存不安全
- 深拷贝 : 分别用不同的内存
//在 class MyString 里添加成员函数 :
String & operator=(const String &s)
{
if (str)
delete[] str;
str = new char[strlen(s.str) + 1];
strcpy(str, s.str);
return *this;
}
以上代码在执行自己赋值给自己的时候出问题
s = s;
//正确写法:
String &String::operator=(const String &s)
{
if (str == s.str)
return *this;
if (str)
delete[] str;
if (s.str)
{ //s.str不为NULL才会执行拷贝
str = new char[strlen(s.str) + 1];
strcpy(str, s.str);
}
else
str = NULL;
return *this;
}
对 operator = 返回值类型的讨论
void好不好?
考虑: a = b = c; 等价于a.operator=(b.operator=(c));
String 好不好?
为什么是 String &
运算符重载时, 好的风格 — 尽量保留运算符原本的特性
考虑: (a=b)=c; //会修改a的值
分别等价于:
(a.operator=(b)).operator=(c);