2 qq 31630271 qq_31630271 于 2016.04.13 00:30 提问

关于c++中默认拷贝构造函数的理解
c++

如题,请解释一次详细的原理
假如我定义一个类的对象a,然后在没有自己编写构造函数的情况下用语句A b=a来初始化新的对象b,会发生什么,为什么?

5个回答

caozhy
caozhy   Ds   Rxr 2016.04.13 00:42

编译器会给你产生一个默认的拷贝构造函数,执行的是浅拷贝。所谓浅拷贝,就是直接字段的拷贝。如果对象包含一个指针,那么两个对象都指向同一个地址。

qq423399099
qq423399099   Ds   Rxr 2016.04.13 09:34

如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。
C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还(两次delete,导致出错)。

luojj26
luojj26   2016.04.13 13:08

如果没有在类的定义中声明并实现自己的拷贝构造函数,编译器将会自动帮你生成一个浅拷贝的拷贝构造函数。
所谓的浅拷贝,就是将两个类中对应的元素相赋值。即将a中的成员一个一个对应地赋值给b中的成员,然后完成b的构建
如果类里面没有指针,浅拷贝和深拷贝产生的效果一样;
如果类里面有指针,浅拷贝就只会将a中指针的值赋值给b中的指针,那么就只是a与b中的指针指向同一个区域而已,
而我们的本意无疑是应该想要b中的指针指向另一个区域,这个区域中的内容和a中指向的区域的内容相等。
所以这个时候,就需要我们自己去写拷贝构造函数,完成深拷贝

CSDNXIAON
CSDNXIAON   2016.04.13 15:12

对c++拷贝构造函数的一点理解
linux平台C++中拷贝构造函数及“=”重载的理解
c++默认的拷贝构造函数是浅拷贝
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

VisualEleven
VisualEleven   Ds   Rxr 2016.04.14 16:55

如果你没有提供构造拷贝函数,编译器会为你自动合成一个

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
理解C++中拷贝构造函数
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。  用户可以根据实际需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果用户没有声明类的拷贝构造函数,系统会自动生成一个默认的拷贝构造函数,它的功能
C++ - 默认复制构造函数 执行 浅拷贝
默认复制构造函数 执行 浅拷贝 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23941807 C++, 会默认生成一个复制构造函数, 当类中出现指针时, 复制会执行浅拷贝, 即只复制指针的地址, 不会复制数据; 所以在类中, 使用指针时, 需要注意; 如果想使用深拷贝, 可以添加复制构造函数. 以下代码, 如果不添加复制构造函数, 则会运行
c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起
1. c++类的默认拷贝构造函数的弊端c++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数。它们的特殊之处在于: (1)当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且其函数体为空; (2)当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,进行成员变量之间的拷贝。(这个拷贝操作是浅拷贝)这里只讲拷贝构造函数。在c语言中,int a = 5; /
C++派生类的构造函数和复制控制
派生类的构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员,像任何类一样,如果类没有定义自己的构造函数和复制控制成员,编译器自动合成。 1.构造函数 派生类的构造函数先要初始化基类的成员,然后初始化本类的成员 下面定义一个Father类,头文件如下: #if !defined(AFX_FATHER_H__C5B84CD6_0B79_4806_BEDA_035EB4183
STL容器与默认拷贝构造函数,默认赋值函数
这两个函数都采用“按成员拷贝”的默认方式来实现。也就是说:它们会依次调用每个数据成员的默认拷贝函数和默认赋值函数,除非为它们显示定义了新的构造函数和赋值函数;如此递归下去,真到所有成员都是基本类型为止。但是要知道,基本类型变量(包括指针)的拷贝和赋值实际上是按bit位进行的,因此假如类中有指针成员,这两个默认函数的执行结果将是两个对象中的对应指针成员指向相同的对象,而这在一般情况下关非所期望的,在
C++中一个关于复制构造函数和指针的问题
Copy构造函数是显式地去处理一个对象初始化另一个对象的问题,如果类含有一个指针的话,那么处理起来主要分为两种情况。 A. 指针在类的构造或者初始化时指向动态分配的内存, 并在对象析构时对该指针进行delete操作,释放内存资源。 这种情况下,对指针的操作是万万不能简单对指针地址进行赋值操作的。应该是动态申请内存,然后按值Copy具体内容,从而防止指针指向无效内存地址的情况。 B. 指针指向
拷贝构造函数和赋值的深入理解
1、什么是拷贝构造函数 拷贝构造函数分为两类: 一类是系统默认提供的拷贝构造函数,只是简单的把栈里面的数据进行拷贝,堆上面的内容没有进行拷贝(详细的情况,后面分析) 二类是自己定义的拷贝构造函数,能够对堆上面的东西进行深度的拷贝(详情见后面分析) 2、什么情况下调用拷贝构造函数? 对象声明的时候就初始化(赋值) public class Student{ private:
C++复制构造函数和拷贝构造函数
1 拷贝构造函数参数的特点 赋值构造函数要申请内存。就像一般的构造函数一样。 而赋值操作,是已经申请好了内存。只是赋值。 对于一个类X,如果一个构造函数的第一个参数是下列之一: a) X& b) const X& c) volatile X& d) const volatile X& 因此 X::X(X&, int=1); //是拷贝构造函数 并且类中可以存在超过一个拷
C++结构体:默认构造函数,复制构造函数,重载=运算符
C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值。 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就需要实现上述三个函数,否则就只能用指针了。 #include #include using namespace std; struct ST { int a;
深入理解C++对象模型之拷贝构造函数
如果一个Class没有声明一个copy constructor,编译器就会隐式声明一个copy constructor,只有编译器需要的时候,编译器才会定义一个copy constructor实例,并合成于程序之中,而编译器需要的时候是指Class不展现出bitwise copy semantics(位逐次拷贝)。即“如果一个Class未定义出copy constructor,编译器就会自动为它产生出一个”这句话是不对的,只有当Class不展现出bitwise copy semantics时编译器才会产生一