C++ 类的赋值运算时,构造函数的调用

在C++中重载 "+" 和 "=" 运算符时,构造函数如何调用。

cpp 复制代码
#include <iostream>
using namespace std;

class Box
{
    int length;
    std::string name = "box_default";
public:
     Box(std::string s) {
         name = s;
         std::cout << "Default constructor: "<< name << std::endl;
    }
     Box(const Box& b) {
         std::cout << "Copy constructor: "<< b.name << ", length: " << b.length << std::endl;
         std::cout << "Copy constructor : this : " << this->name <<  std::endl;
         this->length = b.length;
         this->name = "box_copy";
         std::cout << "Copy constructor end: this : " << this->name << ", b : " << b.name << std::endl;
     }
     
    int getLength(void)
    {
        return length;
    }
    void setLength(int len)
    {
        length = len;
    }
    // 重载 + 运算符,用于把两个 Box 对象相加
    Box operator+(const Box& b)
    {
        Box box("box+");
        box.length = this->length + b.length;
        std::cout << "operator+: this: " << this->name << " ,b: " << b.name << std::endl;
        return box;
    }

    Box& operator = (const Box& b) {
        std::cout << "operator=: this: " << this->name << ", b: " << b.name << std::endl;
        std::cout << "length: " << b.length << std::endl;
        this->name = b.name;
        this->length = b.length;
        return *this;
    }
};
// 程序的主函数
int main()
{
    Box Box1("box1");                // 声明 Box1,类型为 Box
    Box Box2("box2");                // 声明 Box2,类型为 Box
    Box Box3("box3");                // 声明 Box3,类型为 Box

    // Box1 详述
    Box1.setLength(6);

    // Box2 详述
    Box2.setLength(12);

    // Box1 
    cout << "Length of Box1 : " << Box1.getLength() << endl;

    // Box2 
    cout << "Length of Box2 : " << Box2.getLength() << endl;

    // 把两个对象相加,得到 Box3
    Box3 = Box1 + Box2;

    // Box3 
    cout << "Length of Box3 : " << Box3.getLength() << endl;

    return 0;
}

运行上述代码后的结果:

cpp 复制代码
Default constructor: box1
Default constructor: box2
Default constructor: box3
Length of Box1 : 6
Length of Box2 : 12
Default constructor: box+
operator+: this: box1 ,b: box2
Copy constructor: box+, length: 18
Copy constructor : this : box_default
Copy constructor end: this : box_copy, b : box+
operator=: this: box3, b: box_copy
length: 18
Length of Box3 : 18

由上述结果可知:

在执行 Box3 = Box1 + Box2; 这句代码时, 先调用了 operator+, 随后调用拷贝构造函数 Box(const Box& b), 最后调用 operator =.

  1. 调用 operator+: 先创建一个 Box 对象 box+, this 指针隐式指向 Box1, Box2作为 引用参数
  2. 调用拷贝构造函数 Box(const Box& b): 此时会调用拷贝构造函数拷贝 operator+ 的返回值的副本作为 operator = 运算的右值
  3. 最后调用 operator =.
相关推荐
明明跟你说过9 分钟前
【Go语言】从Google实验室走向全球的编程新星
开发语言·后端·go·go1.19
凌盛羽1 小时前
C#对Excel表csv文件的读写操作
开发语言·windows·物联网·microsoft·c#·excel
VBA63371 小时前
VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释
开发语言
Dontla1 小时前
Rust字节数组(Byte Array)Rust u8、Vec<u8>、数组切片、向量切片、字符串转字节数组转字符串、&[u8]类型:字节数组引用
开发语言·rust
走在考研路上3 小时前
Python错误处理
开发语言·python
数据小爬虫@3 小时前
Python爬虫:如何优雅地“偷窥”商品详情
开发语言·爬虫·python
CV大法好3 小时前
刘铁猛p3 C# 控制台程序引用System.Windows.Forms报错,无法引用程序集 解决方法
开发语言·c#
工业甲酰苯胺3 小时前
C语言之输入输出
c语言·c++·算法
Days20503 小时前
uniapp小程序增加加载功能
开发语言·前端·javascript
C++忠实粉丝3 小时前
计算机网络之NAT、代理服务、内网穿透、内网打洞
网络·c++·网络协议·计算机网络·http·智能路由器