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

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

在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.kler.cn/a/529929.html

相关文章:

  • 克隆OpenAI(基于openai API和streamlit)
  • 面试问题知识
  • Clion开发STM32时使用stlink下载程序与Debug调试
  • GenAI 在金融服务领域的应用:2025 年的重点是什么
  • 什么是线性化PDF?
  • litemall,又一个小商场系统
  • 稀疏进化训练:机器学习优化算法中的高效解决方案
  • 蓝桥杯备考:枚举算法之铺地毯
  • R语言绘制有向无环图(DAG)
  • 普通用户(非root) 安装libreoffice
  • Python的那些事第九篇:从单继承到多继承的奇妙之旅
  • 【leetcode详解】T598 区间加法
  • 手机Python爬虫教程:利用手机学习Python爬虫的终极指南_python可以在手机上写爬虫吗
  • 人机交互系统实验三 多通道用户界面
  • C++模板编程——可变参函数模板之折叠表达式
  • 使用 DeepSeek-R1 与 AnythingLLM 搭建本地知识库
  • IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案
  • bat脚本实现自动化漏洞挖掘
  • 【零基础学JAVA】数据类型
  • 20250202在Ubuntu22.04下使用Guvcview录像的时候降噪
  • Java/Kotlin HashMap 等集合引发 ConcurrentModificationException
  • [HOT 100] 0167. 两数之和 ||
  • Elasticsearch 指南 [8.17] | Search APIs
  • python算法和数据结构刷题[6]:二叉树、堆、BFS\DFS
  • 机器学习算法在网络安全中的实践
  • 系统学习算法: 专题八 二叉树中的深搜