首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的手写拷贝构造函数生成的代码与默认的不同?

手写拷贝构造函数与默认的拷贝构造函数之间的差异在于其实现方式和功能。

默认的拷贝构造函数是编译器自动生成的,它执行的是浅拷贝操作。浅拷贝只是简单地将源对象的成员变量的值复制给目标对象的对应成员变量,这样两个对象会共享同一块内存空间。当其中一个对象发生改变时,另一个对象也会受到影响。

而手写的拷贝构造函数可以根据需求进行深拷贝或其他定制化操作。深拷贝会创建一个新的对象,并将源对象的成员变量的值复制给目标对象的对应成员变量,但是它们在内存中是独立的,互不影响。这样可以避免因为共享内存而导致的意外修改。

手写拷贝构造函数的生成代码与默认的拷贝构造函数不同的原因可能有以下几点:

  1. 需要进行深拷贝:如果类中包含指针类型的成员变量,那么默认的拷贝构造函数只会复制指针的值,而不会复制指针指向的内容。手写的拷贝构造函数可以通过手动分配内存,并将指针指向的内容复制到新的内存空间中,从而实现深拷贝。
  2. 需要定制化操作:手写的拷贝构造函数可以根据具体需求进行定制化操作,例如对成员变量进行特定的处理或转换。
  3. 需要处理资源管理:如果类中包含需要手动释放的资源,如文件句柄或数据库连接等,手写的拷贝构造函数可以确保在拷贝对象时正确地管理这些资源,避免资源泄漏或重复释放的问题。

总之,手写拷贝构造函数可以根据具体需求进行定制化操作,提供更灵活和精确的对象拷贝方式,以满足特定的业务需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】深拷贝和浅拷贝 ② ( 默认拷贝构造函数是浅拷贝 | 代码示例 - 浅拷贝造成问题 )

一、默认拷贝构造函数是浅拷贝 1、默认拷贝构造函数 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认拷贝构造函数 " , 在函数中对成员变量进行简单复制操作...; 2、默认拷贝构造函数是浅拷贝机制 C++ 编译器 为 类 自动生成 默认拷贝构造函数 是 浅拷贝 , 只能拷贝 顶层 成员变量值 , 如果成员变量 是 引用 或 指针 , 其指向 类 或 内存空间...默认拷贝构造函数 // C++ 编译器提供拷贝构造函数 只能进行浅拷贝 Student s2 = s; 二、代码示例 - 浅拷贝造成问题 下面代码中 , 定义 Student 类 中 ,...定义了 有参构造函数 和 析构函数 , 没有定义拷贝构造函数 , 因此 C++ 编译器为其生成默认拷贝构造函数 , 默认拷贝构造函数 是 浅拷贝 ; 分析下面 创建两个 Student 对象 代码...C++ 编译器会自动生成默认拷贝构造函数 // 打印类成员变量 void toString() { cout << "m_age = " << m_age << " , m_name =

16010

JAVA private私有类 默认构造函数 生成过程

如果一个类没有定义任何构造函数,则编译器将生成一个缺省构造函数,该构造函数访问修改符和类访问修改符相同,例如: class test将生成test()构造函数 public class test将生成...因此编译器不得不再生成一个可访问构造函数,由于这里只有Wrapper类private void testInnerClass()方法使用了new InnerClass(),所以编译器只(需)为这个新构造函数生成了...同时,为了和已有的缺省构造函数有所区别,就加入了一个Wrapper$1类型参数,为此,编译器还要生成一个Wrapper$1类。...为了更简单,(也许)更清晰看到编译器生成class代码工作原理,读者可以使用java反编译器,来 看看class反编译后生成java源程序,下面是作者使用Jad反编译后生成Wrapper类代码...那么为什么编译器一定要生成Wrapper$1类,而不使用随便一个基本类型(例如byte)来作为占位符呢?

1.9K30

OpenCV copyTo、clone、“=”拷贝构造函数区别

opencv中为矩阵复制提供了copyTo函数、clone函数、重载运算符和拷贝构造函数,用法非常简单: Mat srcimage = imread("1.jpg"); Mat firstimage...3120*4160,实验结果如下: 我们可以看到,copyTo函数、clone函数占用时间差不多,但是“= ”运算符拷贝构造函数时间却非常少,这是为什么呢?...**矩阵头尺寸是常数值,但矩阵本身尺寸会依图像不同不同,通常比矩阵头尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大开销是由矩阵造成,而不是信息头。...而拷贝构造函数则 只拷贝信息头和矩阵指针 ,而不拷贝矩阵。但某些时候你仍会想拷贝矩阵本身(不只是信息头和矩阵指针),这时可以使用函数 clone() 或者 copyTo() 。...从上面的话我们可以看到,copyTo函数、clone函数拷贝不仅仅是信息头,还有矩阵本身,而“= ”运算符拷贝构造函数仅仅拷贝了信息头,他们指向其实是一个矩阵,也就是在上程序中,我们改变srcimage

1.1K30

C++四个默认函数构造函数,析构函数拷贝函数,赋值函数

在C++中,对于一个类,C++编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认析构函数 A(const A&) //默认拷贝构造函数 A& operator...构造函数 构造函数是一种特殊成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。...析构函数 构造函数相对立是析构函数,这个函数在对象销毁之前自动调用,例如在构造函数中,我们为成员变量申请了内存,我们就可以在析构函数中将申请内存释放,析构函数写法是在构造函数基础上加一个~符号...这个例子调用默认拷贝构造函数(注意看控制台显示,调用了一次构造函数和两次析构函数),可以看出两个对象成员变量地址是不一样,当成员变量不存在指针类型是,这样做没什么问题,当类中有指针变量,自动生成拷贝函数注定会出错...和拷贝构造函数一样,若类中有指针变量,自动生成赋值函数注定会出错,老样子,先申请内存,再复制值即可完美解决。

2.2K20

C++中转换构造函数默认函数优先级

前言: 在学习谭浩强《c++面对对象设计》一书中,在学到转换构造函数中, 在转换构造函数中 #include using namespace std; class plural...{ public: plural(int a=0,int b=0):real(a),imaginary(b){}; //默认构造函数 plural(double a){real = a;imaginary...plural类作用域中有以下定义: plural p1(3) //建立对象p1,由于只有一个参数,调用转换构造函数 那假如我在类中定义了默认构造函数呢,系统如何选择用哪一个函数呢?...结果 在经过反复调式,测验,并结合其他网上文章,得出一下总结 系统是不会运行你函数出现歧义性,如果你在类中定义了一下: plural(int a=0,int b=0):real(a),imaginary...(参数数据类型是否实参对应)

56130

C++从入门到精通——类6个默认成员函数拷贝构造函数

并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数默认成员函数:用户没有显式实现,编译器会生成成员函数称为默认成员函数。...若未显式定义,编译器会生成默认拷贝构造函数默认拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。...拷贝构造d2,此处会调用Date类拷贝构造函数 // 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认拷贝构造函数 Date d2(d1); return 0; }...注意:在编译器生成默认拷贝构造函数中,内置类型是按照字节方式直接拷贝,而自定义类型是调用其拷贝构造函数完成拷贝。...Data d2 = d1; 实践 如果没有管理资源,一般情况下不需要写拷贝构造函数默认生成拷贝构造函数就可以。

24110

【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认拷贝构造函数情况分析 | 等号 = 运算符重载 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )

, 并支持链式操作 ; 一、等号 = 运算符重载 ---- 1、调用默认拷贝构造函数情况分析 C++ 编译器 为 类 提供 默认 拷贝操作 , 是对 成员变量 简单拷贝 , 是 浅拷贝 ;...进行拓展分析 ; 实现了 深拷贝构造函数 后 , 再次使用一个对象为另一个对象赋值时 , 如 Student s2 = s; 代码 , 就会自动调用 深拷贝构造函数 ; 2、等号 = 运算符重载 ...拷贝构造函数 各自使用场景 等号 = 运算符重载 拷贝构造函数 各自使用场景 : 拷贝构造函数 : 如果 使用对象 为一个 新对象 进行初始化 , 调用拷贝构造函数 ; 等号 = 运算符重载 :...C++ 编译器会自动生成默认拷贝构造函数 public: // 打印类成员变量 void toString() { cout << "m_age = " << m_age << "...(); // 声明 Student 对象 s2 , 并使用 s 为 s2 赋值 // 该操作会调用 默认拷贝构造函数 // C++ 编译器提供拷贝构造函数 只能进行浅拷贝 Student

22020

Python函数迭代器生成示例代码

函数迭代器 函数强大功能叫做迭代器,Python里面最具威力功能之一。...迭代器中有两个基本函数,这个函数叫做方法,这个是面向对象编程称呼一个方法,这两个方法叫做iter()和next()。 1.什么是迭代?...总结 每调用一次next()会输出iter()里面的下一个元素 一直到输出完成 超出长度就会出现异常 函数生成器 我们感受到迭代器功能强大,如何自己制作一个迭代器呢?...举例演示-如何优化上述问题,支持小数 引用yield,带yield函数就叫做生成器 def frange(start,stop,step): x=start#定义一个变量 while x<...到此这篇关于Python函数迭代器生成文章就介绍到这了,更多相关Python函数迭代器生成器内容请搜索ZaLou.Cn以前文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

37010

【C++干货基地】面向对象核心概念实践原理:拷贝构造函数全面解读

1.1 拷贝构造概念 在C++中祖师爷规定了:当我们想把一个对象赋值给另一个对象时候 或者创建一个已存在对象一某一样新对象 时需要调用它拷贝函数来进行复制 如图所见拷贝构造函数是我们六大成员默认函数之一...2.2 不显示定义自动创建 构造拷贝函数既然是六个默认成员函数之一的话,那么肯定也是符合默认成员函数特点如果我们没有显示定义的话自动生成: 那么自动生成拷贝构造函数帮我们完成了什么事情呢?...代码演示: 这里我们就可以看到就算我们不写默认成员函数那么编译器也会自动生成 默认拷贝构造函数拷贝和赋值,这是可能就有人要问了既然默认生成 拷贝构造函数 可以完成复制那么为什么要我们手动创建呢...这是因为默认生成拷贝构造函数完成只是浅拷贝,只是把值复制过去了 2.3 浅拷贝拷贝 说到浅拷贝和深拷贝很多铁汁们不太明白,什么是浅拷贝?深拷贝拷贝了那些内容?...默认生成拷贝构造函数只会进行值拷贝而我们在不申请资源的话,值拷贝就是我们需要功能。

2600

箭头函数普通函数(function)区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么

基本不同 1.写法不同,箭头函数使用箭头定义,普通函数中没有 .箭头函数都是匿名函数,普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。...在普通函数中,this总是指向调用它对象,如果用作构造函数,this指向创建对象实例。箭头函数中没有this,声明时捕获其所在上下文this供自己使用。...所以箭头函数结合call(),apply()方法调用一个函数时,只传入一个参数对this没有影响。...obj x fn1.apply(obj); // obj x fn2.call(obj); // window x fn2.apply(obj); // window x 4.箭头函数不可以做构造函数...,不能使用new 关键字,因为new关键字是调用函数对象constructor属性,箭头函数中没有该属性,所以不能new function fn1(){ console.log

1.8K10

关于Java构造函数(Constructor)常见问题总结1 为什么调用子类构造方法时候,默认会调用父类构造方法2 常见错误:Implicit super constructor is und

1 为什么调用子类构造方法时候,默认会调用父类构造方法 看下面这个简单例子: package cc; public class Sub extends Super { public Sub...编译器错误是因为默认super()无参构造函数是没有定义。在Java中,如果一个类没有定义构造函数,编译器会自动插入一个默认无参构造函数。...解决这个问题很简单,我们可以给父类插入一个无参构造函数,或者在子类构造函数中显示调用父类有参构造函数。 在子类构造函数中显示调用父类构造函数 下面的代码是正确。 ?...为什么Java在一个类已经实现了一个带参构造函数时候,不实现默认无参构造函数? 这是个很有趣问题。...我们知道如果在一个类中没有声明一个构造函数,那么编译器会隐式帮我们实现一个无参构造函数,但如果我们一旦一个构造函数,不管带不带参数,那么编译器都不会提供默认构造函数,所以这么做原因是为什么呢?

2.7K30

【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 拷贝构造函数 析构函数 调用情况分析 )

一、匿名函数 拷贝构造函数 1、匿名函数回顾 在上一篇博客 【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 ) 中 , 分析了匿名函数几种用法..., 以及不同使用场景下 , 匿名对象 创建销毁情况 ; C++ 编译器 发现 使用 匿名对象 时 , 会根据 匿名对象 用法 , 决定对 匿名对象 处理 ; 匿名对象单独使用 : 如果只是单纯使用...将一个对象赋值给另外一个对象 ) 【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 ) 博客中 , 分析了 拷贝构造函数 调用时机 ; " 拷贝构造函数 " 又称为..., 匿名对象销毁 ; 3、代码示例 - 函数返回匿名对象 初始化 变量 在下面的代码中 , fun 函数返回值是 Student 类型匿名对象 ; // 函数返回值是 Student 类型对象...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在

26720

【C++11特性篇】【强制禁止 】生成默认函数关键字default&delete(代码演示)

一.强制生成默认函数关键字default 根据以上2,3点,我们知道: 没有实现 析构函数拷贝构造拷贝赋值重载 中任意一个,编译器才会生成默认移动构造 如果我们已经自己生成了三个函数某一个...,这时编译器不再生成默认移动构造,但是我们依旧希望他生成,该怎么操作?...int main() { Person s1; Person s2 = s1; Person s3 = std::move(s1); return 0; } 二.禁止生成默认函数关键字...delete 只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数默认版本,称 =delete修饰函数为 删除函数 如下面代码场景所示:`Person(Person&& p) =...、拷贝构造拷贝赋值重载 ,编译器理应默认生成移动构造 Person(Person&& p) = delete; //此时移动构造不会生成 private: bit::string

16610

【C++】C++ 类中 this 指针用法 ③ ( 全局函数 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象返回引用 )

; 详细代码 , 参考最后完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数 , 就是通过 this 指针隐藏左操作数 , 对象本身...return s; } 详细代码 , 参考最后完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 类定义了有参构造函数 , 则其默认无参构造函数 , 就不会生成...执行 Student 构造函数" << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 方式调用 默认构造函数 创建...Student 对象 , 就会报错 ; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 类名 对象名 方式定义对象变量 ; class Student...public: int age; // 年龄 int height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象返回引用 ---- 在上面的章节中

18620

深入理解javascript中继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承法扩展增强模式多重继承法寄生式继承借用构造函数构造器于

之前我们介绍了多种javascript中继承方式,最后我们开始总结概括这些继承方式,先将javascript中继承分类,根据不同条件,可以分成不同类别。...中继承模式 原型链法 示例: Child.prototype = new Parent(); 分类: 使用了原型 基于构造继承模式 ** 注意 **: 默认继承机制 我们可以将需要重用属性和方法移到原型中...该函数会执行对象拷贝,并可以进行扩展,然后返回对象 借用构造函数: 实例: function Child() { Parent.apply(this, arguments); } 分类: 基于构造函数模式...** 注意 **: 仅继承自身属性 方法一结和使用方便继承原型 方便于子对象继承某个对象具体属性 构造器于属性拷贝 实例: function Child() { Parent.apply(this...,arguments); } extend2(Child,Parent); 分类: 基于构造器模式 使用原型链 属性拷贝 ** 注意 ** 借用构造原型属性拷贝结合 允许在不重复调用父对象构造情况下同时继承自身属性和原型属性

45720

【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数参数传递键值对参数 | 完整代码示例 )

文章目录 一、Groovy 构造函数中为成员赋值 二、Groovy 函数参数传递键值对参数 三、完整代码示例 一、Groovy 构造函数中为成员赋值 ---- Groovy 类没有定义构造函数 ,...但是可以使用如下形式构造函数 , 为 Groovy 类设置初始值 ; new 类名(成员名1: 成员值1, 成员名2: 成员值2) 顺序随意 : 成员顺序随意 , 没有强制要求 , 只需要 成员名... 成员值对应即可 ; 个数随意 : 成员个数随意 , 可以为所有的属性赋值 , 也可以只为其中部分属性赋值 ; 如下代码 : class Student { def name def..., ${student3.age}" 执行结果为 : student : Tom , 18 student2 : Jerry , 16 student3 : Jim , null 二、Groovy 函数参数传递键值对参数...---- 在 Groovy 构造函数中 , 可以使用 成员名1: 成员值1, 成员名2: 成员值2 类型参数 , 这是键值对 map 类型集合 ; 但是对于普通函数 , 不能使用上述格式 ,

9.1K20

Java对象属性复制组件-Mapstruct项目改造指南

而MapStruct上面五个组件原理都不同。 以上提到属性无法复制,都是在不使用手动写Convert函数情况下进行讨论 3. MapStruct 1....为什么选择MapStruct 接下来就要介绍MapStruct 这个工具类,这个工具类之所以运行速度硬编码差不多,这是因为MapStruct在编译期间就生成属性复制代码,运行期间就无需使用反射或者字节码技术...项目中使用了fastjson,因此业务代码中出现很多处需要反射调用无参构造函数。...但在上面一步升级lombok过程中,lombok对于@Builder实现出现了一些修改:在1.16.22生成代码中,是存在private级别的无参构造函数;而在1.18.12生成代码中,并没有私有无参构造函数...,从而导致了业务代码大量出现缺少默认构造函数报错。

2.5K41

C++之拷贝构造函数浅copy和深copy

,定义类对象初始化时看属于哪种类型: Test t;//对应无参构造函数 Test t(1);//对应有参构造函数 Test t1; Test t2=t1;//对应拷贝构造函数 比如下面定义类对象属于无参构造函数...(当然前提是你手写了其他构造函数,虽然说编译器会默认提供,但是既然要手写,那么三种构造函数就在定义类对象时候按需求来写),如果只写了有参数构造函数,那么编译器就会报错: #include <iostream...: (1)浅拷贝 拷贝后对象物理状态相同 (2)深拷贝 拷贝后对象逻辑状态相同 (3)编译器提供拷贝构造函数只进行浅拷贝 代码版本一: #include #include <string...(1)对象中有成员指代了系统中资源 成员指向了动态内存空间 成员打开了外存中文件 成员使用了系统中网络端口 注意:一般来说,自定义拷贝构造函数(也就是我们自己手写),必然需要实现深拷贝!...二、总结: C++编译器会默认提供构造函数 无参构造函数用于定义对象默认初始化状态 拷贝构造函数在创建对象时拷贝对象状态 对象拷贝有浅拷贝和深拷贝两种方式。

38320
领券