形式: Class_name & Class_name::operator=(const Class_name & other);// 接受并返回一个指向类对象的引用.
1, 赋值运算符的功能以及何时使用它.
将已有的对象赋给另一个对象时, 将使用重载的赋值运算符:
- StringBad headline1("xxxxxxxx");
- .......
- StringBad knot;
- knot = headline1;// 这个地方将使用赋值运算符, 默认的赋值运算符同样为浅复制
初始化对象时, 并不一定会使用赋值运算符:
StringBad metoo = knot;
这里, metoo 是一个新创建的对象, 初始化为 kont 的值, 因此这里使用拷贝构造函数.
2, 赋值的问题出在哪里.
与浅复制拷贝构造函数的的问题相同, 1 中的 knot 和 headline1 对象的地址相同, 一但析构其中一个对象, 另一个对象的数据将受损.
3, 解决赋值的问题 --- 重载赋值运算符
- Class_name & Class_name::operator=(const Class_name & other){
- if(this == &other) return *this;// 防止自赋值浪费资源, 并且还会在释放内存时删除对象的内容.
- if(str!=NULL){
- // 清空空间中原有的内容
- delete [] str;
- str = NULL;
- }
- int len = strlen(other.str) + 1;
- str = new char[len];
- memset(str, 0, len);
- strcpy(str, other.str);
- return *this;
- }
来源: http://www.bubuko.com/infodetail-2965532.html