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

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;  // 输出 10return 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.mrgr.cn/news/52627.html

相关文章:

  • Apache Calcite - 将Sql转换为关系表达式
  • 【顺序表的模拟实现Java】
  • 计算机视觉——人像的分割与无缝融合
  • Vue 3 的不同版本总结
  • 有源滤波器(三)
  • 基于SSM医药垃圾分类管理系统【附源码】
  • springboot定时任务
  • C#笔记(1)
  • “ps“指的是皮秒(picosecond)
  • 如何克服解决 Git 冲突的恐惧症
  • 【时时三省】(C语言基础)函数介绍strcmp
  • 限流是什么?如何限流?怎么限流?
  • Java interface 接口的巧妙应用:让你的代码更优雅
  • 图论刷题
  • 【算法】约瑟夫环问题
  • 期货配资系统风控逻辑开发/完整源代码
  • Oracle Expdp按条件导出-指定表数据
  • 【Vue】Vue(八)Vue3.0 使用ref 和 reactive创建响应式数据
  • 单点登录的要点
  • 终端 数据表格