C++ 拷贝构造函数

来源:互联网 发布:ubuntu kylin 分区 编辑:程序博客网 时间:2024/05/19 07:42

1、拷贝构造函数的调用

  1. CExample A(100);
  2. CExample B = A;  (调用拷贝构造函数)
  3.  CExample B(A); 调用拷贝构造函数
用一个对象初始化另一个对象时,调用复制构造函数

2、C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用

其拷贝构造函数或者默认拷贝构造函数。
/*--------------------------------------
在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还。
3、关于浅复制和深复制

浅复制(默认构造函数)


深复制


4、拷贝构造函数格式

拷贝构造函数必须跟类名一致

  1. X::X(const X&); //是拷贝构造函数
  2. X::X(X&, int=1); //是拷贝构造函数
  3. X::X(X&, int a=1, int b=2); //当然也是拷贝构造函数

自定义拷贝构造函数

  1.  Rect(const Rect& r)
  2. {
  3. width = r.width;
  4. height = r.height;
  5. m_strName = new char(20);
     memset(m_strName,0,20);
     memcpy(m_strName,r.m_strName,20); (重新为对象分配内存,并且初始化)
  6. }  

  1. CExample B = A;  (调用拷贝构造函数)
  2.  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
原创粉丝点击