赋值运算符的重载

赋值运算符的重载

赋值运算符 ‘=’ 重载

  • 赋值运算符 两边的类型 可以 不匹配

    • 把一个 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);

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注