C++中的拷贝构造器(Copy Constructor)

embedded/2025/2/3 21:48:07/

在C++中,拷贝构造器(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。当使用一个已存在的对象来初始化一个新对象时,拷贝构造器会被调用。

拷贝构造器的定义

拷贝构造器的一般形式如下:

class ClassName {
public:// 拷贝构造器ClassName(const ClassName& other) {// 实现对象成员的拷贝}
};
  • 参数:拷贝构造器接受一个同类型对象的常量引用作为参数。使用常量引用是为了避免不必要的对象复制,同时确保原始对象不会被修改。
  • 函数名:拷贝构造器的函数名与类名相同。

调用拷贝构造器的场景

  1. 使用一个对象初始化另一个对象
#include <iostream>class Point {
private:int x;int y;
public:// 构造函数Point(int x = 0, int y = 0) : x(x), y(y) {}// 拷贝构造器Point(const Point& other) : x(other.x), y(other.y) {std::cout << "Copy constructor called" << std::endl;}void print() {std::cout << "x: " << x << ", y: " << y << std::endl;}
};int main() {Point p1(1, 2);Point p2(p1); // 调用拷贝构造器p2.print();return 0;
}
  1. 对象作为函数参数按值传递
#include <iostream>class Point {
private:int x;int y;
public:// 构造函数Point(int x = 0, int y = 0) : x(x), y(y) {}// 拷贝构造器Point(const Point& other) : x(other.x), y(other.y) {std::cout << "Copy constructor called" << std::endl;}void print() {std::cout << "x: " << x << ", y: " << y << std::endl;}
};void func(Point p) {p.print();
}int main() {Point p(1, 2);func(p); // 调用拷贝构造器return 0;
}
  1. 函数返回对象
#include <iostream>class Point {
private:int x;int y;
public:// 构造函数Point(int x = 0, int y = 0) : x(x), y(y) {}// 拷贝构造器Point(const Point& other) : x(other.x), y(other.y) {std::cout << "Copy constructor called" << std::endl;}void print() {std::cout << "x: " << x << ", y: " << y << std::endl;}
};Point createPoint() {Point p(1, 2);return p; // 调用拷贝构造器
}int main() {Point p = createPoint();p.print();return 0;
}

默认拷贝构造器

如果没有为类显式定义拷贝构造器,编译器会自动生成一个默认的拷贝构造器。默认拷贝构造器会执行浅拷贝,即逐个复制对象的成员变量。

浅拷贝和深拷贝

  • 浅拷贝:默认拷贝构造器执行的是浅拷贝,它只是简单地复制对象的成员变量。如果对象包含指针成员,浅拷贝会导致两个对象的指针指向同一块内存,当其中一个对象被销毁时,另一个对象的指针会变成悬空指针。
  • 深拷贝:深拷贝会为新对象分配独立的内存,并将原始对象的数据复制到新的内存中。当类包含动态分配的内存时,需要显式定义拷贝构造器来实现深拷贝。
#include <iostream>
#include <cstring>class MyString {
private:char* str;
public:// 构造函数MyString(const char* s = "") {if (s == nullptr) {str = new char[1];str[0] = '\0';} else {str = new char[strlen(s) + 1];strcpy(str, s);}}// 拷贝构造器(深拷贝)MyString(const MyString& other) {str = new char[strlen(other.str) + 1];strcpy(str, other.str);std::cout << "Deep copy constructor called" << std::endl;}// 析构函数~MyString() {delete[] str;}void print() {std::cout << str << std::endl;}
};int main() {MyString s1("Hello");MyString s2(s1); // 调用深拷贝构造器s2.print();return 0;
}

在这个例子中,MyString 类的拷贝构造器实现了深拷贝,为新对象分配了独立的内存,并将原始对象的字符串复制到新的内存中。这样,当一个对象被销毁时,不会影响另一个对象。


http://www.ppmy.cn/embedded/159280.html

相关文章

96,【4】 buuctf web [BJDCTF2020]EzPHP

进入靶场 查看源代码 GFXEIM3YFZYGQ4A 一看就是编码后的 1nD3x.php 访问 得到源代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;用于调试或展示代码结构 highlight_file(__FILE__); // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全漏洞 erro…

设计模式Python版 适配器模式

文章目录 前言一、适配器模式二、适配器模式实现三、适配器模式在Django中的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…

游戏引擎介绍:Game Engine

简介 定义&#xff1a;软件框架&#xff0c;一系列为开发游戏的工具的集合 可协作创意生产工具&#xff0c;复杂性艺术&#xff0c;注重realtime实时 目的 为艺术家&#xff0c;设计师&#xff0c;程序员设计工具链 游戏引擎开发参考书 推荐&#xff1a;Game Engine Archite…

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…

通过Redisson构建延时队列并实现注解式消费

目录 一、序言二、延迟队列实现1、Redisson延时消息监听注解和消息体2、Redisson延时消息发布器3、Redisson延时消息监听处理器 三、测试用例四、结语 一、序言 两个月前接了一个4万的私活&#xff0c;做一个线上商城小程序&#xff0c;在交易过程中不可避免的一个问题就是用户…

Vue 响应式渲染 - 列表布局和v-html

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 列表布局和v-html 目录 列表布局 简单渲染列表 显示索引值 点击变色 V-html 作用 注意 采用策略 应用 总结 列表布局 简单渲染列表 Data中设置状态&#xff0c;是一个数组格式的默认信息。 然后…

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…

计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)

应用层概述&#xff1a; 功能&#xff1a; 常见协议 应用层与其他层的关系 网络应用模型 C/S模型&#xff1a; 优点 缺点 P2P模型&#xff1a; 优点 缺点 DNS系统&#xff1a; 基本功能 系统架构 域名空间&#xff1a; DNS 服务器 根服务器&#xff1a; 顶级域…