C++ 拷贝构造函数
来源:互联网 发布:ubuntu kylin 分区 编辑:程序博客网 时间:2024/05/19 07:42
1、拷贝构造函数的调用
- CExample A(100);
- CExample B = A; (调用拷贝构造函数)
- CExample B(A); (调用拷贝构造函数)
2、C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用
其拷贝构造函数或者默认拷贝构造函数。
/*--------------------------------------
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还。
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还。
浅复制(默认构造函数)
深复制
4、拷贝构造函数格式
拷贝构造函数必须跟类名一致
- X::X(const X&); //是拷贝构造函数
- X::X(X&, int=1); //是拷贝构造函数
- X::X(X&, int a=1, int b=2); //当然也是拷贝构造函数
自定义拷贝构造函数
- Rect(const Rect& r)
- {
- width = r.width;
- height = r.height;
- m_strName = new char(20);memset(m_strName,0,20);memcpy(m_strName,r.m_strName,20); (重新为对象分配内存,并且初始化)
- }
- CExample B = A; (调用拷贝构造函数)
- CExample B(A); (调用拷贝构造函数)
如果不自定义拷贝构造函数,则是调用默认的拷贝构造函数(浅拷贝),则A和B的m_strName 变量指向同一块内存,若改变B对象m_strName的值 ,则A的m_strName也被改变。调用自定义的拷贝构造函数(深拷贝),重新为B分配内存,改变B不影响A
示例代码
#include<iostream>
#include<cstring>
using namespace std;
class people
{
public:
int m_nSex;
char *m_strName;
people(int sex,const char *name)
{
cout<<"people 构造"<<endl;
m_nSex = sex;
m_strName = new char(20);
memset(m_strName,0,20);
memcpy(m_strName,name,20);
}
//拷贝构造函数
people(const people &r)
{
cout<<"people 拷贝构造函数"<<endl;
m_nSex = r.m_nSex;
m_strName = new char(20);
memset(m_strName,0,20);
memcpy(m_strName,r.m_strName,20);
}
virtual ~people()
{
cout<<"people 析构前"<<endl;
delete m_strName;
cout<<"people 析构后"<<endl;
}
void show()
{
cout<<endl;
cout<<m_nSex<<endl;
cout<<m_strName<<endl;
}
};
int main()
{
people you(20,"jax");
you.show();
people he(you);
const char *myName = "masteryi";
memcpy(he.m_strName,myName,20);
he.show();
you.show();
}
0 0
- 【C++】拷贝构造函数
- C++:拷贝构造函数
- c++"拷贝构造函数
- C++: 拷贝构造函数
- 【C++】拷贝构造函数
- c++::拷贝构造函数
- 【C++】:拷贝构造函数
- 【C++】拷贝构造函数
- C++:拷贝构造函数
- C++_拷贝构造函数
- C++_拷贝构造函数
- 拷贝构造函数(C++)
- 拷贝构造函数(C++)
- C/C++ 拷贝构造函数
- c++(拷贝构造函数)
- 5.c++-拷贝构造函数(深拷贝,浅拷贝)
- c++_拷贝构造函数/浅拷贝/深拷贝
- 【C++】拷贝构造函数和赋值函数
- Placeholder
- Rust中文翻译23
- Android5.1 电池充电剩余时间计算
- 黑马程序员——Java要点笔记——String类
- 树莓派搭建简易的NAS服务器
- C++ 拷贝构造函数
- 设置MyEclipse支持Java/JS页面的自动完成提示
- 挖财首席架构师王福强:架构设计中的6大关键点
- linux下svn命令大全
- demo_扫雷小游戏初始化
- 黑马程序员--Objective-C——Block与@protocol
- tableViewCell
- iOS开发系列--UITableView全面解析
- 一些比较常用的插件