首页
学习
活动
专区
工具
TVP
发布

拷贝构造

目录 拷贝构造特殊构造函数类型转换构造拷贝构造类型转换构造拷贝构造示例关键字 explicit深拷贝和浅拷贝拷贝----复制地址深拷贝----复制内存何时需要自定义拷贝构造函数深浅拷贝示例程序...&that); //用另一个复数来构造复数 注意:如果一个类没有定义拷贝构造函数,那么编译器会提供一个默认拷贝构造函数,默认是类型是public 类型转换构造拷贝构造示例 定义一个复数类Complex...var_1); delete var_4; cin.get(); return 0; } //打印结果 无参构造 0+0i 类型转换构造 5+0i 拷贝构造 拷贝构造 5+0i...何时需要自定义拷贝构造函数 如果类带有指针变量,并有动态内存分配,则它必须自定义一个拷贝构造函数。...拷贝地址 系统默认的拷贝构造没有权限分配堆区内存 默认构造函数是浅拷贝 this->m_account = that.m_account; #endif #if 1 //深拷贝

56530

拷贝构造与深浅拷贝

---- 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。...class person { public: person(); //默认构造函数 person(const person&);//拷贝构造函数 }; 拷贝构造函数的第一个参数必须是一个引用类型...如果没有定义一个拷贝构造函数,编译器会自动为我们定义一个,与合成拷贝构造函数。 合成拷贝构造函数用来阻止我们拷贝该类类型的对象。合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。...每个成员的类型决定了它如何拷贝,对于类类型的成员,会使用其拷贝构造函数来拷贝,内置类型的成员则直接拷贝。...拷贝初始化,要求编译器将右侧运算对象拷贝到正在创建的对象中,如果有需要还要进行类型转换。

13520
您找到你想要的搜索结果了吗?
是的
没有找到

拷贝构造函数 浅拷贝与深拷贝

拷贝构造函数 上一期中我们讲述了构造函数的相关内容,谈到构造函数在形式上有几种分类,即带参数的、不带参数的以及参数列表初始化的,还有一种传引用的构造函数,称为拷贝构造函数,顾名思义,就是起到拷贝的功能,...我们还是用Point这个类作为例子进行讲解,拷贝构造函数就是参数类型为引用类型的构造函数。...class Point { double x,y; public: Point(Point & point); }; 浅拷贝 所有的类都有自己的拷贝构造函数,如果程序员自己没有写拷贝构造函数,那么系统会默认生成一个缺省的拷贝构造函数...,它采取逐位复制的方法进行对象拷贝,又称为浅拷贝。...我们自己写一个Point类的浅拷贝拷贝构造函数作为例子: Point::Point(Point & point) { x=point.x; y=point.y; } 这就是浅拷贝,即逐位复制。

19930

C++拷贝构造函数(深拷贝,浅拷贝)

就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。   ...例如:类X的拷贝构造函数的形式为X(X& x)。   当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。...如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。   ...自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。   ...当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候,系统将会提供给一个默认的拷贝构造函数来完成这个过程,上面代码的复制核心语句就是通过

1.1K70

CC++开发基础——拷贝构造移动构造委托构造

本章主要内容: 一,对象的复制 二,拷贝构造函数 1.概念介绍 2.拷贝构造函数的代码样式 3.代码样例 三,拷贝赋值运算符 1.概念介绍 2.拷贝赋值运算符的代码样式...对象发生复制时会调用拷贝构造函数。 如果定义一个类的时候没有定义自己的拷贝构造函数,编译器会根据需要生成一个默认的拷贝构造函数。...调用了拷贝构造函数. 调用了拷贝构造函数. 调用了拷贝构造函数. 调用了拷贝构造函数....拷贝赋值运算符的使用场景和拷贝构造函数不一样,如果对一个已经构造过的对象进行拷贝赋值,则此时并不会调用拷贝构造函数,而是调用拷贝赋值运算符。...调用了拷贝构造函数. 调用了构造函数. 调用了拷贝赋值运算符.

15210

C++拷贝构造函数

对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。...这个隐含的拷贝构造函数简单的关联了所有的类成员。注意到这个隐式的拷贝构造函数和显式声明的拷贝构造函数的不同在于对成员的关联方式。...拷贝构造函数使程序更有效率,因为它不用再构造一个对象的时候改变构造函数的参数列表。设计拷贝构造函数是一个良好的风格,即使是编译系统会自动为你生成默认拷贝构造函数。...上面的语句中,如果类中定义了拷贝构造函数,在对象复制初始化时,调用的将是拷贝构造函数,而不是缺省构造函数。在拷贝构造函数中,可以根据传入的变量,复制指针所指向的资源。...默认拷贝构造函数     很多时候在我们都不知道拷贝构造函数的情况下,传递对象给函数参数或者函数返回对象都能很好的进行,这是因为编译器会给我们自动产生一个拷贝构造函数,这就是“默认拷贝构造函数”,这个构造函数很简单

1.9K80

c++拷贝构造函数

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。...如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。...拷贝构造函数的最常见形式如下: #include using namespace std; class Line{ public: int getlength(); Line...(int len);//简单的构造函数 Line(const Line&obj);//拷贝构造函数 ~Line();//析构函数 private: int *ptr; }; //成员函数的定义...,包括构造函数 Line::Line(int len) { cout << "调用构造函数 "<<endl; //为指针分配内存 ptr = new int; *ptr = len;

98010

C++拷贝构造函数

假定有类T 则下列情况调用的函数是不一样的: T a = b; a=b; 第一种情况调用的是拷贝构造函数 第二种情况调用的是赋值运算符。...默认的拷贝构造函数执行的是浅拷贝,在对象涉及到动态分配的存储空间时,会出现问题。 在a中修改变量值后,b中的也发生改变。...出现内存泄漏(只new但是没有delete就会出现这样的问题) 一个地址被多次释放也会出错 要解决上面的问题,就要执行深拷贝拷贝使得每一个对象成员都有自己的内存空间。...要执行深拷贝,那么就要自己定义拷贝构造函数。 主要操作在于,对于动态分配的空间,重新new一块出来,再执行strcpy。...下面是一个拷贝构造函数的例子 String::String(const String && T){} 在上面这个例子之中,&&代表的是右值引用,扩大了临时变量的生命周期。

55830

js拷贝拷贝

device-width, initial-scale=1.0"> Document 1234567891011// 在JS...数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中, // 而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中// 当基本类型实现浅拷贝...// 当复杂类型实现浅拷贝,新对象与旧对象仍然同时指向堆内存的同一属性,互不独立,相互影响。...// 也就是说当我们创建新数组newArr时,赋予newArr的是arr在栈中的地址(指针), // 其实仍与旧数组arr共享同一个内存,所以修改新数组newArr后,旧数组arr也会被修改// 深拷贝...// 它可以将复杂类型的数据相互独立出来,互不影响 // 深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型, // 这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据

2.5K20

OJ题之手机服务(构造+拷贝构造+堆)

它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造拷贝构造、打印、停机。...---------------------------------------- 5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出 6、拷贝构造的作用是复制已有对象的信息...但来手机类的拷贝构造函数时,问题出现了,这个停机日期怎么复制,它只是一个指针,还有可能是一个空指针,那么我们只能在它不是空指针的时候给它复制吧,这又涉及到了一个问题,对于一个指针,怎么样达到复制的目的?...好了,这操作叫浅拷贝,如果这样做的话,表面上来看的话,似乎也达到了复制目的,但实际上更应该叫共用而不是复制,因为它们两个指向了同一块内存。...所以我们需要复制的是指针指向的内容而不是指针本身,这叫深拷贝,这意味着我们首先需要申请堆内存,然后复制内容。 好了,最意外的事情又发生了,申请堆内存的语句报错了!!!

16740

EasyC++71,拷贝构造函数

这是EasyC++系列的第71篇,来聊聊拷贝构造函数。 拷贝构造函数 我们上一篇文章当中聊了面向对象中的一些坑,有的时候我们命名重载了构造函数和析构函数,但还是有问题。...这些成员函数有: 默认构造函数 默认析构函数 拷贝构造函数 赋值运算符 地址运算符 编译器将会生成最后三个函数的定义——拷贝构造函数、赋值运算符和地址运算符。...拷贝构造函数 拷贝构造函数用于将一个对象复制到新创建的对象中。它用于初始化过程中,而不是常规的复制过程中。...何时调用 新建一个对象并且初始化的时候,拷贝构造函数都会被调用。...每当程序生成了对象副本,都会使用拷贝构造函数。也就是说当函数按值传递对象或函数返回对象时,都会使用拷贝构造函数。 默认的拷贝构造函数 默认的拷贝构造函数逐个赋值非静态成员,复制的是成员的值。

20820

拷贝构造函数剖析【C++】

拷贝构造函数 知识点: 解释:拷贝构造函数是一种特殊的构造函数,它具有一般构造函数的所有特性,但其形参是本类对象的引用。...拷贝构造函数的参数采用引用方式。...若把一个真实的类对象作为参数传到拷贝构造函数,引起无穷递归; 拷贝构造函数的名字必须与类名相同,且无返回值; 拷贝构造函数只有一个参数,必须为本类对象的引用; 每一个类必须有一个拷贝构造函数。...若用户定义类时未给出拷贝构造函数,则系统会自动产生一个缺省的拷贝构造函数; 该例重点阐述:为什么拷贝构造函数的参数必须为同类对象的引用?...调用两个参数的构造函数 调用拷贝构造函数 a=(3,4) c=(3,4) 调用拷贝构造函数 n=(5.6,7.9) 调用拷贝构造函数 调用两个参数的构造函数 (8.6,11.9) 本例中,当程序执行到

48320

C++之拷贝构造函数

拷贝构造函数 拷贝构造函数最常见的是当我们创建的对象是用该类的另一个对象来进行初始化的,此时调用的构造函数就是拷贝构造函数。拷贝构造函数实质上就是构造函数的重载。...当你不显式定义拷贝构造函数的时候,C++会给你提供一个默认拷贝构造函数,这和它提供默认构造函数是一样的。...但是当你一旦显式定义了构造函数和拷贝构造函数,那么C++将不再提供默认构造函数和默认拷贝构造函数。 下面这三种情形是常见的需要拷贝构造函数的场景。...因此只会调用两次拷贝构造函数,一次析构函数。 剩余的析构函数调用则是在程序结束之前调用。 浅拷贝 默认拷贝构造函数就是执行浅拷贝操作。浅拷贝它只完成了值拷贝。...这时候就需要我们自己动手实现一个拷贝构造函数。在构造函数中没有出现分配内存或者数组的情形下,我们使用默认拷贝构造函数就足够了。 深拷贝拷贝是需要在拷贝构造函数中进行内存分配或者是数组赋值操作。

68610

js库 - 浅拷贝 & 深拷贝

然后面试中经常会问、业务中也经常会遇到的问题就是深浅拷贝的问题了。 栈内存中简单数据类型直接拷贝就能得到一个副本,但是复杂数据类型的拷贝如果也想得到一个副本,就需要深拷贝了。...浅拷贝: var a = 1; var b = a; 这就是浅拷贝了,虽然你视觉上看上去a = b;但是修改b的值,a不会收影响。因为b是a的一个副本,就像你拷贝了一个文件夹副本一样。...深拷贝 具体深拷贝就是要理解了复杂类型拷贝的缺点,然后再进行弥补。 既然想要复杂类型也像简单类型那样拷贝一个新数据的话,就不单单是拷贝地址了。...(target == "[object Object]") { result = "object"; } else { result = target;//构造类...对object类型中,还有构造类需要区分。直接返回[object String]这样类型的。但其实在深拷贝阶段,直接将其放到object形式处理了。

2K30
领券