当前位置: 首页 > ops >正文

拷贝构造函数如果不加引用会怎样?

 博主介绍:程序喵大人

  • 35- 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

最近训练营里有同学问:

图片

那拷贝构造函数不加引用会怎么样呢?

贴段代码:

#include <iostream>
class A {public:    A() {std::cout << "A \n";}~A() {std::cout << "~A \n";}// A(const A& a) {    //     std::cout << "A(const& A) \n";    // }    A(const A a) {        std::cout << "A(const A) \n";}A& operator=(const A& a) {if (&a == this) {return *this;}std::cout << "operator= \n";return *this;}
};

编译结果如图:

图片

可以看到,如果拷贝构造函数不加引用,编译都会失败的,那为什么编译器要这样限制,为什么一定要加引用呢?

拷贝构造函数的参数必须是引用,因为如果不是,我们将不得不通过值传递对象。通过值传递对象将需要拷贝对象,这将调用拷贝构造函数。

这会导致拷贝构造函数调用的无限循环,而通过使用引用,就可以避免这个无限循环,因为引用不会创建新对象,而是指向现有对象的内存位置。

考虑以下带有接受引用参数的拷贝构造函数的类:

class MyClass {
public:int a;// 常规构造函数MyClass(int value) : a(value) {}// 接受引用参数的拷贝构造函数MyClass(const MyClass &obj) {a = obj.a;}
};
int main() {MyClass original(5); // 调用常规构造函数MyClass copy(original); // 调用接受引用参数的拷贝构造函数
}

在这个例子中,创建copy对象时,调用了拷贝构造函数,并且它接受对original对象的引用。这避免了无限循环问题,因为引用简单地指向现有对象的内存位置,并且在过程中没有创建新对象。

如果不加引用:

MyClass(MyClass obj) {a = obj.a;
}

这将在拷贝时导致无限循环,因为:

  1. 通过值传递时会创建一个新对象。

  2. 创建新对象需要调用拷贝构造函数

  3. 调用拷贝构造函数需要通过值传递对象,导致步骤1。

通过在拷贝构造函数中使用引用参数,可以防止这种无限循环,因为在传递引用时不会创建新对象。

所以编译器直接在源头就规避了这种问题,防止我们多踩坑。

   码字不易,欢迎大家点赞关注评论,谢谢!

C++训练营

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!

http://www.xdnf.cn/news/6391.html

相关文章:

  • 【搭建Node-RED + MQTT Broker实现AI大模型交互】
  • 乐观锁、悲观锁、分布式锁
  • 金仓数据库使用sys_walfile_name函数时的时间线问题排查指南
  • [MySQL数据库] SQL优化
  • C++ asio网络编程(6)利用C11模拟伪闭包实现连接的安全回收
  • 牛客网NC22012:判断闰年问题详解
  • 串口共用错误排查指南(2025年5月15日 09:25)
  • 实战分析Cpython逆向
  • 树节点数据处理:属性拼接
  • scratch课后一练--运动模块
  • C++从入门到实战(十五)String(上)介绍STL与String的关系,为什么有string类,String有什么用
  • u3d 定义列表详细过程
  • 如何使用易路iBuilder智能体平台快速安全深入实现AI HR【实用帖】
  • 【实战篇】低代码报表开发——平台运营日报表的开发实录
  • Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】
  • 《无限暖暖》画质测评
  • Python函数返回值的艺术:为何True/False是更优实践及例外情况分析
  • 自定义类型:结构体
  • 动态防御实战:如何用智能调度化解T级DDoS攻击
  • 【J2】乘法逆元
  • 【FileZilla】Client端的线程模型 (一)
  • Linux的进程管理和用户管理
  • 西门子S7-1200 MC卡使用方法及故障现象分析
  • R S的EMI接收机面板
  • 阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代
  • P1303 A*B Problem
  • 山东大学计算机图形学期末复习7——CG11上
  • UDP 多点通信
  • 各编程语言对正则表达式标准的支持对比
  • 【Android】Android 实现一个依赖注入的注解