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 =.
相关推荐
blueman88886 小时前
Qt5通过vcpkg中调用时,在debug模式下调试时总是调用release的plugins文件夹中的dll
c++·qt·cmake
我是坏垠7 小时前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant7 小时前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
Bobolink_7 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
你怎么知道我是队长8 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
xingke8 小时前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
戮漠summer9 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
jinyishu_9 小时前
C++ string使用方法
开发语言·c++
EW Frontier9 小时前
三级跳突破864维动作空间——QMIX-Hierarchical多无人机协同通信方法全解析【附python代码】
开发语言·python·无人机·强化学习·通信资源分配
名字还没想好☜9 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js