news 2026/7/4 3:34:32

C++:拷贝构造函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:拷贝构造函数

一、什么是拷贝构造函数?

拷贝构造函数是一种特殊的构造函数,它的参数是同类型对象的常量引用,即用已存在的一个变量初始化另一个同类型变量。

classPerson{public:// 拷贝构造函数Person(constPerson&other){name=other.name;age=other.age;cout<<"拷贝构造被调用"<<endl;}// 其他...private:string name;intage;};

二、拷贝构造函数的语法规则

  • 函数名与类名相同。

  • 没有返回值。

  • 参数必须是同类型对象的引用,通常为 const 。

  • 可以自定义,也可以让编译器自动生成。

classMyClass{public:// 拷贝构造函数的典型形式MyClass(constMyClass&other);};
为什么参数要写引用
  • 如果类没有管理动态资源(比如没有 new 分配内存),我们其实只需要把原对象的值复制给新对象就够了。那能不能直接把原对象的值当作普通参数传给拷贝构造函数,让它用这个值来初始化新对象呢?
  • 答案是不行,原因在于:
    • C++规定:传值传参必须调用拷贝构造。而我们若在实现拷贝构造时使用传值传参,则又会生成新的拷贝构造,如此不断生成新的拷贝构造,最后会造成死循环。

三、何时调用拷贝构造函数?

用一个对象初始化另一个对象
Personp1("Alice",25);Person p2=p1;// 调用拷贝构造Personp3(p1);// 调用拷贝构造
函数参数按值传递
voidfunc(Person p){...}func(p1);// 实参p1拷贝给形参p,调用拷贝构造
函数按值返回对象
Personcreate(){Persontemp("Bob",30);returntemp;// 返回值时可能调用拷贝构造(或移动语义)}
容器中的元素插入

当容器需要复制元素时,会调用拷贝构造。(如 vector 的 push_back)

四、默认拷贝构造函数

编译器自动生成的拷贝构造
  • 如果类中没有定义拷贝构造函数,编译器会自动生成一个,它执行浅拷贝(shallow copy):逐个复制成员变量的值。
什么时候需要自己写拷贝构造?
  • 当类中有指针成员并指向动态分配的内存时,浅拷贝会导致两个对象共享同一块内存(应该为新对象申请一块新的内存,需要自己手动实现,若执行浅拷贝,则会直接),释放时会产生重复释放或内存泄漏。
classShallow{public:int*data;Shallow(intval){data=newint(val);}// 编译器生成的默认拷贝构造:data = other.data(浅拷贝)};intmain(){Shallowa(10);Shallow b=a;// 两个对象的data指向同一块内存!// 析构时会重复释放,导致未定义行为。}

五、深拷贝:自定义拷贝构造函数

  • 为了正确复制包含动态资源的对象,我们需要自定义拷贝构造函数,执行深拷贝(deep copy):申请一块新的空间,再复制原指针指向的内容。
classDeep{int*data;public:Deep(intval){data=newint(val);}// 深拷贝构造Deep(constDeep&other){data=newint(*other.data);// 重新分配并复制值}~Deep(){deletedata;}};intmain(){Deepa(10);Deep b=a;// 深拷贝,各自拥有独立内存// 安全销毁}

六、拷贝构造与赋值运算符的区别

  • 拷贝构造:用已有对象初始化新对象(对象尚未创建)。
  • 赋值运算符:将已有对象的值赋给已存在的对象(对象已创建)。
Personp1("Alice",25);Person p2=p1;// 拷贝构造(p2尚未创建)Personp3("Bob",30);p3=p1;// 赋值运算符(p3已存在)

七、禁止拷贝

  • 如果类不希望被复制,可以显式删除拷贝构造函数(C++11):
classNonCopyable{public:NonCopyable()=default;NonCopyable(constNonCopyable&)=delete;// 禁止拷贝};

八、如何使用

  • 如果有资源的申请分配,一般要自己实现。

  • 如果自定义了析构函数、拷贝构造、拷贝赋值其中之一,通常需要自定义其他每个。

  • 优先使用深拷贝:当类管理动态内存时,务必实现深拷贝。

  • 用 const 引用:避免不必要的拷贝,提高性能。

  • 使用移动语义(C++11)减少拷贝开销,适合临时对象。

九、完整示例

#include<iostream>#include<cstring>usingnamespacestd;classString{char*buf;public:String(constchar*s=""){buf=newchar[strlen(s)+1];strcpy(buf,s);}// 拷贝构造(深拷贝)String(constString&other){buf=newchar[strlen(other.buf)+1];strcpy(buf,other.buf);cout<<"拷贝构造"<<endl;}~String(){delete[]buf;}voidshow()const{cout<<buf<<endl;}};intmain(){Strings1("Hello");String s2=s1;// 调用拷贝构造s1.show();s2.show();return0;}

十、总结

  • 拷贝构造函数控制对象如何被复制,是类设计的重要一环。

  • 浅拷贝适合简单类,管理资源的类需要深拷贝。

  • 编译器默认生成拷贝构造,但自定义更灵活、更安全。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 3:32:45

椭圆曲线 Diffie-Hellman 密钥交换解题思路

在密码学入门中&#xff0c;椭圆曲线密码&#xff08;ECC&#xff09;以其更短的密钥长度和更高的安全性备受青睐。而椭圆曲线 Diffie-Hellman&#xff08;ECDH&#xff09;则是 ECC 最经典的应用之一&#xff0c;它允许双方在不安全的信道上协商出一个共享秘密。最近在解决 Cr…

作者头像 李华
网站建设 2026/7/4 3:32:26

集团知识管理平台建设方案:74页PpT爆款干货全解析!

很多公司搞知识管理&#xff0c;看起来热闹&#xff0c;实际却是一堆文件躺在服务器里吃灰。业务部门找不到想要的方案&#xff0c;技术人员每次新人培训要翻几十个文件夹。知识库变成了“死库”&#xff0c;没人用&#xff0c;也没人维护。更头疼的是&#xff0c;领导问一声“…

作者头像 李华
网站建设 2026/7/4 3:31:56

【2026万字实录】从理论到实战:网络信息安全全景深度解析与避坑指南

【2026万字实录】从理论到实战&#xff1a;网络信息安全全景深度解析与避坑指南 &#x1f4cc; 核心导读 站在2026年的技术节点&#xff0c;网络安全已不再是“防火墙杀毒软件”的简单堆砌&#xff0c;而是演变为涵盖云原生、人工智能、数据治理与地缘合规的复杂巨系统。本文拒…

作者头像 李华
网站建设 2026/7/4 3:31:31

后 Django 时代:SQLAlchemy 2.0、Tortoise 与 Piccolo 三大异步 ORM 选型指南

参赛选手# SQLAlchemy 2.0&#xff1a;数据库界的工业母机# 如果说 Python 数据库领域有一座神庙&#xff0c;那供奉的一定是 SQLAlchemy。在经历了漫长的 1.x 时代后&#xff0c;2.0 版本的发布标志着它正式拥抱了强类型标注和原生异步。 SQLAlchemy 在 GitHub 上拥有 11.7…

作者头像 李华
网站建设 2026/7/4 3:29:44

几分钟完成 OpenClaw 安装,Windows 可视化步骤新手直接照搬

OpenClaw&#xff08;小龙虾&#xff09;Windows\苹果系统 一键部署保姆级教程 | 10 分钟养出你的数字员工&#xff08;2026 最新版&#xff09; 前言 2026 年热门的开源 AI 智能体 OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标超 28 万&#xff0c;凭…

作者头像 李华
网站建设 2026/7/4 3:29:14

手撕字符串算法:反转、回文、验证回文 Ⅱ 完整拆解

文章目录一、反转字符串1.1 问题引入1.2 解法&#xff1a;split → reverse → join1.3 深入原理&#xff1a;JS 的"包装类"机制1.4 补充&#xff1a;手写 reverse&#xff08;不用 API&#xff09;二、判断一个字符串是否是回文字符串2.1 什么是回文串2.2 解法一&am…

作者头像 李华