c++拷贝构造函数(深拷贝、浅拷贝)——转
拷贝构造函数:
拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类的一个引用变量,该参数是const类型,不可变的。例如:类A的拷贝构造函数的形式为A(A& x)。当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况会自动调用拷贝构造函数:
1、一个对象以值传递的方式传入函数体
2、一个对象以值传递的方式从函数返回,如下:
#include <iostream>
using namespace std;
class B
{
public:
B(){cout<<"构造函数B"<<endl;}
B(int i):data(i){cout<<"构造函数B"<<" "<<data<<endl;}
B play(B b){return b;}
~B(){cout<<"析构函数B"<<endl;}
private:
int data;
};
int main()
{
B temp;
temp.play();
return ;
}
3、一个对象需要通过另一个对象进行初始化
如果在类中没有显示地声明一个拷贝构造函数,那么编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的拷贝。自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。
深拷贝和浅拷贝:
在某些情况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝(位拷贝又称浅拷贝),也就是把对象里面的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员也指向同一块内存。这就出现了问题:把B内存释放了,这时A内的指针就是野指针了,出现运行错误。
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之没有重新分配资源就是浅拷贝。
浅拷贝:如果复制的对象中引用了一个外部内容(例如分配在堆上的数据),那么在复制这个对象的时候,让新旧两个对象指向同一个外部内容,就是浅拷贝。(指针虽然复制了,但所指向的空间内容并没有复制,而是由两个对象共用,两个对象不独立,删除空间存在)
#include <iostream>
#include <string.h>
using namespace std;
class Example
{
private:
int a;
char *str;
public:
Example()
{
cout<<"调用构造函数"<<endl;
}
~Example()
{
cout<<"调用析构函数"<<endl;
} Example(int b)
{
a=b;
cout<<"调用构造函数"<<endl;
}
Example(const Example& example)//自定义拷贝构造函数
{
a=example.a;
}
void show()
{
cout<<a<<endl;
}
}; int main()
{
Example a1();
Example a2=a1;
a2.show();
return ;
}
输出:
调用构造函数
10
调用析构函数
调用析构函数
深拷贝:如果在复制这个对象的时候为新对象制作了外部对象的独立复制,就是深拷贝。
#include <iostream>
#include <string.h>
using namespace std;
class Example
{
private:
int a;
char *str;
public:
Example()
{
cout<<"调用构造函数"<<endl;
}
~Example()
{
delete str;
cout<<"调用析构函数"<<endl;
} Example(int b,char* e_str)
{
a=b;
str=new char[b];
strcpy(str,e_str);
cout<<"调用构造函数"<<endl;
}
Example(const Example& example)//自定义拷贝构造函数
{
a=example.a;
str=new char[a];//深拷贝
if(str!=)
strcpy(str,example.str);
}
void show()
{
cout<<str<<endl;
}
}; int main()
{
Example a1(,"Hello");
Example a2=a1;
a2.show();
return ;
}
输出:
调用构造函数
Hello
调用析构函数
调用析构函数
参考地址:https://www.cnblogs.com/BlueTzar/articles/1223313.html
c++拷贝构造函数(深拷贝、浅拷贝)——转的更多相关文章
- C++拷贝构造函数(深拷贝&浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- 【C++】拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...
- c++中拷贝构造函数,浅拷贝和深拷贝的区别
在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...
- 拷贝构造函数(深拷贝vs浅拷贝)
拷贝构造函数(深拷贝vs浅拷贝) 类对象之间的初始化是由类的拷贝构造函数完毕的.它是一种特殊的构造函数,它的作用是用一个已知的对象来初始化还有一个对象.假设在类中没有显式地声明一个拷贝构造函数.那么, ...
- 【C++札记】拷贝构造函数,浅拷贝和深拷贝
一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
- C++拷贝构造函数:浅拷贝与深拷贝
在介绍C++浅拷贝与深拷贝之前,我们先引出C++的拷贝构造函数. C++拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用.用于在建立一个新的对象时,使用一个已经存在的对象来初始化这个新对象.因 ...
随机推荐
- tinyweb集成springmvc 的一种可行方式
最近tiny项目中集成了springmvc,而且使用的tiny的版本比较低,所以整合起来官网给的前两种方式都行不通. 而且有个tiny整合springmvc的maven依赖都下载不了.所以只有使用第三 ...
- AngularJS中$interval和$timeout的使用
我们在项目中会出现定时刷新,延迟加载等多种场景. 接下来就看$interval和$timeout的使用 $interval可用于定时任务,我们只需在controller注入$interval即可使用. ...
- Remote Debugging (2)
use Eclipse| a Java application 创建一个简单的maven项目 Main.java package cn.zno; public class Main { public ...
- 1.8.1suspend与resume方法使用
暂停线程意味着线程还能恢复运行 suspend()方法暂停线程.resume()恢复线程 测试如下 package com.cky.thread; /** * Created by edison on ...
- python读取并写入mat文件
用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); save matData.mat 用python3读取并写入 ...
- Matlab绘图添加直角坐标轴
绘制y=x^2,并添加直角坐标轴. clear;clc;close all %% 绘制方程 x = -10:0.01:10; figure; y = x.^2-30; plot(x,y,'k','li ...
- ArcGIS 点云转DEM
- 【python 字典、json】python字典和Json的相互转换
[python 字典.json]python字典和Json的相互转换 dump/dumps字典转换成json load/loadsjson转化成字典 dumps.loads直接输出字符 dump.lo ...
- Mybatis类型转换介绍
1.1 目录 1.2 建立TypeHandler 1.2.1 TypeHandler接口 1.2.2 BaseTypeHandler抽象类 1.3 注册TypeHa ...
- Android listview 侧滑 SwipeListView 详解 实现微信,QQ等滑动删除效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28508769 今天看别人项目,看到别人使用了SwipeListView,Goog ...