赋值运算符的重载

/ 0评 / 0

赋值运算符的重载

赋值运算符 ‘=’ 重载

编写一个长度可变的字符串类String

string s = "hello"; // =是初始化语句
string s;
s = "hello"; //赋值语句

s1 = s2:拷贝

 //在 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);

发表评论

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