C++学习笔记--复制构造函数

一.复制构造函数
#include<iostream>
using namespace std;
class A
{
 public:
   A(int x, int y)//构造函数
   {
	m = x;
        n = y;
   }
   A(A& t)//复制函数
   {
	m = t.m;
	n = t.n;
   }
   void print(void){cout << n << m <<endl;}
private:
   int m;
   int n;
};
int main(void)
{
  A a(2,4);
  a.print();
  A b(a);//调用了复制构造函数进行复制
  b.print();
  return 0;
}
二.浅层复制构造函数
每个对象都有默认的复制构造函数,但是默认的复制构造函数只是把传递进来的每个成员变量的值复制给新对象的成员变量,当变量是指针的时候可能会出现问题。
#include<iostream>
using namespace std;
class A
{
 public:
   A()//构造函数
   {
	m = new int;
        *m = 10;
   }
   A(A& t)//复制函数
   {
	m = t.m;
   }
   void set(int x){ *m = x;}
   void print(void){cout << * m <<endl;}
private:
   int* m;
};
int main(void)
{
  A a;
  a.print();//10
  A b(a);//调用了复制构造函数进行复制
  b.print();//10
  b.set(5);
  b.print()//5;
  a.print();//5
  //delete a;//编译错误,析构a的同时将b的m指针指向的那块内存也析构了,所以b.m此时已经是迷途指针,程序处于崩溃边缘
  return 0;
}
三.深层复制构造函数
对于浅层复制构造函数所产生的问题可以通过自己构建深层复制构造函数来解决。
#include<iostream>
using namespace std;
class A
{
 public:
   A()//构造函数
   {
	m = new int;
        *m = 10;
   }
   A(A& t)//深层复制构造函数
   {
	m = new int;
	*m = *(t.m);
   }
   void set(int x){ *m = x;}
   void print(void){cout << * m <<endl;}
private:
   int* m;
};
int main(void)
{
  A a;
  a.print();//10
  A b(a);//调用了复制构造函数进行复制
  b.print();//10
  b.set(5);
  b.print()//5;
  a.print();//10
  delete a;//不会出现编译错误,因为经过深层复制构造函数构造的b的m指针于a的m指针分别指向了两块不同的内存
  return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值