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

问题描述

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

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

解决方案

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

解决方案二:

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

解决方案三:

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

解决方案四:

对c++拷贝构造函数的一点理解
linux平台C++中拷贝构造函数及“=”重载的理解
c++默认的拷贝构造函数是浅拷贝

解决方案五:

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

时间: 2024-12-27 11:46:43

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

对象-编译器合成默认拷贝构造函数问题

问题描述 编译器合成默认拷贝构造函数问题 看<深度探索C++对象模型>遇到的问题. P49里的例子对于bitwise copy semantics展现了memberwise的拷贝,但是后面P50下面说bitwise copy semantics不需要合成拷贝构造函数. 在P52页的两个例子中,第一个说没合成,我的理解也就是没有初始化int和char*,但之后的第二个合成了拷贝构造函数,不仅初始化了string,更初始化了int. 我又用vs测试了下,发现可以运行 class B { publi

c++类默认拷贝构造函数---浅复制

类默认的拷贝构造函数是浅复制,比如如下程序,类中指向的地址是一样的 #include <iostream> using namespace std; class Test { public: int *a; }; int main() { Test *t = new Test(); int aa = 1314520; t->a = &aa; Test *t2 = new Test(*t); cout<<t->a<<endl; cout<<

C++中的构造函数,拷贝构造函数和赋值运算

关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋值方式有构造函数,拷贝构造函数,赋值运算符这三种方法,如下代码演示了这几种常见的方法.     A a1;    A a2(a1);    A a3 = a1;    a3 = a2; 如果不手动写代码,C++编译器默认提供了构造函数,拷贝构造函数,赋值运算符的这三种方法的默认实现. 默认构造函数没有参数,它

C++中拷贝构造函数的应用详解_C 语言

一.C++中拷贝构造函数的定义: 有一个参数的类型是其类类型的构造函数是为拷贝构造函数. 如下所示: X::X( const X& x); Y::Y( const Y& y, int =0 ); //可以是多参数形式,但其第二个即后继参数都有一个默认值 二.拷贝构造函数的应用: 当一个类对象以另一个同类实体作为初值时,大部分情况下会调用拷贝构造函数. 一般是这三种具体情况: 1.显式地以一个类对象作为另一个类对象的初值,形如X xx=x; 2.当类对象被作为参数交给函数时. 3.当函数返回

基于c++中的默认拷贝函数的使用详解_C 语言

<c++编程思想>上说一个类如果没有拷贝函数,那么编译器就会自动创建一个默认的拷贝函数.下面就让我们看一下真实的情况. 首先看一个简单的类X,这个类没有显示定义拷贝构造函数. c++源码如下: 复制代码 代码如下: class X {private:    int i;    int j;}; int main() {    X x1;//先定义对象x1    X x2 = x1;//将x1拷贝给x2} 下面是其汇编代码: 复制代码 代码如下: _main    PROC ; 7    : i

C++之拷贝构造函数

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100;   int b = a;    而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对象拷贝的简单例子. [c-sharp] view plaincopy #include <iostream>   using namespace std;      class CExample {   privat

C++拷贝构造函数详解

转自:http://blog.csdn.net/lwbeyond/article/details/6202256 对于一个空类,编译器默认生成四个成员函数:默认构造函数.析构函数.拷贝构造函数.赋值函数: 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 1 #include <iostream> 2 us

C/C++ 拷贝构造函数

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plain copy int a = 100;   int b = a;    而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对象拷贝的简单例子. [c-sharp] view plain copy #include <iostream>   using namespace std;      class CExample {   priv

c++拷贝构造函数(深拷贝,浅拷贝)详解

一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a;     而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子.    #include<iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a=b; printf(&q