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

C++之默认拷贝函数

C++ 会在以下情况自动生成默认拷贝构造函数,即拷贝构造函数未被显式定义时,编译器为类创建一个浅拷贝的构造函数:

1. 类中没有用户定义的拷贝构造函数

如果类中没有提供拷贝构造函数,编译器会为类生成一个默认的拷贝构造函数。这种构造函数会执行成员逐个拷贝的操作,即按成员的类型进行浅拷贝。

2. 类的成员没有被禁止拷贝

默认拷贝构造函数不会为某些特殊成员生成,比如:

  • 有些成员类型明确禁止拷贝(如 std::unique_ptr),在这种情况下,编译器不会生成默认拷贝构造函数。
  • 如果类的成员包含某些无法拷贝的对象,拷贝构造函数会被禁止(例如,类中包含了 delete 掉拷贝构造函数的对象)。

默认拷贝构造函数的行为:

默认的拷贝构造函数会做浅拷贝,逐个成员变量按其类型进行复制操作。

  • 基本类型(如 intdouble 等)会直接拷贝其值。
  • 指针类型:只拷贝指针的地址,导致源对象与目标对象共享同一块内存资源。

默认拷贝构造函数生成的规则:

  1. 没有用户定义的拷贝构造函数:如果类中没有定义任何拷贝构造函数,编译器会生成一个默认的拷贝构造函数。
  2. 没有其他操作删除拷贝构造函数:如果程序员显式 delete 了拷贝构造函数,编译器就不会自动生成默认构造函数。

示例:

class MyClass {
public:
    int x;
    MyClass(int a) : x(a) {}
    // 编译器将自动生成一个默认的拷贝构造函数
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1;  // 调用默认拷贝构造函数
    std::cout << obj2.x << std::endl;  // 输出 10
    return 0;
}

在这个例子中,MyClass 没有定义拷贝构造函数,因此编译器会生成一个默认的拷贝构造函数,执行浅拷贝。

禁止拷贝构造的情况:

有些情况下,编译器会禁止生成默认拷贝构造函数。例如,使用了 std::unique_ptr 或者显式 delete 拷贝构造函数时:

class MyClass {
public:
    std::unique_ptr<int> ptr;
    MyClass(int val) : ptr(new int(val)) {}
    
    // 显式删除拷贝构造函数
    MyClass(const MyClass& obj) = delete;
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1;  // 错误,拷贝构造函数被删除
    return 0;
}

总结:

  • C++ 在没有显式定义拷贝构造函数时,会自动生成一个默认拷贝构造函数
  • 默认拷贝构造函数会执行浅拷贝,逐个复制对象的成员。
  • 如果类中的成员或特定情况禁止拷贝,编译器不会生成默认拷贝构造函数。

http://www.kler.cn/news/353773.html

相关文章:

  • 护眼台灯哪个牌子最好?当心劣质护眼灯三大缺陷
  • [Git] Git下载及使用 从入门到精通 详解(附下载链接)
  • React组件传值方法
  • gbase8s的事务、并发控制、锁机制、隔离级别
  • MD5 在数据库中的应用与安全性分析
  • leetcode-301. 删除无效的括号
  • GaussDB 主备版本8 -schema及操作
  • Windows server 2022 数据中心版本的安装
  • 链接伪类(:hover)CSS背景图片有闪动BUG的解决方法 vue3
  • 【1-1】STM32F407学习笔记之中断
  • error Replace `··` with `↹` react开发格式化问题
  • MybatisWebApp
  • vue综合指南(一)
  • 跨站脚本(XSS)攻击示例概念验证
  • [week1] newstar ctf ezAndroidStudy
  • SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务
  • 【读书笔记-《30天自制操作系统》-30】Day31
  • 计算机网络基础(1)
  • Python单例模式(三种实现方式:覆写__new__方法、使用装饰器、使用元类)(单例模式之线程安全)(单例的懒汉模式与饿汉模式)
  • 【python实操】python小程序之文件操作的JSON读取和JSON修改