赋值运算符重载与拷贝构造函数
(1)区分初始化时的赋值(一般就叫初始化),和非初始化时的赋值(一般就叫赋值)
(2)实验验证初始化和赋值时各自对应
避免赋值运算符中的自赋值
(1)自赋值就是Person a; a = a;
(2)自赋值如果不处理,轻则浪费效率,重则导致内存丢失(该深拷贝时做了浅拷贝,在2.4.8中详解)
(3)避免自赋值很简单,只需要在赋值运算符重载函数所有操作前加上一个判断 if (this != &other)即可
// 重载赋值运算符// Coordinate operator=(const Coordinate &other)// {//这样会导致重载赋值运算时会执行这个函数Coordinate &operator=(const Coordinate &other) { //这样就不会std::cout << " 重载赋值运算符 " << std::endl;if (this == &other) {return *this; // 处理自赋值}x = other.x;y = other.y;return *this;}
赋值运算符重载函数返回引用
返回引用好处1:提升程序效率
(1)赋值运算符重载函数返回值可以返回对象类型,也可以返回对象引用类型,都能工作。代码验证
(2)区别在于:返回引用可以避免一次返回值值传递的对象复制,这需要消耗资源的。代码验证
(3)总结:虽然C++语法并未强制要求,但是好的写法是应该返回引用
返回引用好处2:允许连续赋值式
(1)返回对象而不是引用时,在连续赋值(c = a = b;)时会编译可以,运行也可以,但是效率低同1中所讲。
(2)原因是先执行a=b操作,返回值再作为第2次赋值运算的右值(也就是函数参数),对象和引用是类型兼容的
(3)总结:连等在返回对象和引用时都可以,但是在返回void时就不可以了
Coordinate &operator=(const Coordinate &other) { //这样就不会std::cout << " 重载赋值运算符 " << std::endl;if (this == &other) {return *this; // 处理自赋值}x = other.x;y = other.y;return *this;}Coordinate *operator=(const Coordinate *other) {std::cout << " *other重载赋值运算符 " << std::endl;if (this == other) {return this; // 处理自赋值}x = other->x;y = other->y;return this;}Coordinate a(3, 4);Coordinate b = a; // 拷贝构造函数Coordinate c;c = &a; //*other重载赋值运算符 c = b; // 重载赋值运算符std::cout << "a: " << a << std::endl;std::cout << "b: " << b << std::endl;std::cout << "c: " << c << std::endl;
总结
定义新变量并且使用已有变量对堆新变量进行初始化时会调用拷贝构造函数
对已经定义的变量使用已有变量进行赋值运算时会调用赋值运算符
函数返回值不同,不能构成重载
运算符重载传参的尴尬,导致引用的产生
学习记录,侵权联系删除。
来源:朱老师物联网大课堂