浅拷贝:拷贝的是地址(这个不太懂,别人博客的写法)
深拷贝:拷贝的是内容
对于没有指针的类,进行浅拷贝是没有问题的;
对于含有指针的类中,对于默认的拷贝构造函数也是浅拷贝;
会将两个指针指向同一个地址,再进行一次delete操作的时候,会将一个指针删除,另外一个则成为野指针;
导致程序崩溃;
简单的写法:(没加头文件)
int main()
{
/* 浅拷贝
int *p = new int;
*p = 5;
//cout<<*p;
int *q = p;
delete q;
delete p;*/
/* 深拷贝
int *p = new int;
*p = 5;
//cout<<*p;
int *q = new int;
*q = *p;
cout << *p << " " << *q << endl;
delete q;
delete p;*/
return 0;
}
对于c++的拷贝构造函数:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x) cout<<"bug"<<x<<endl;
typedef long long LL;
const int N = 1e5 + 10, M = 1e6 + 10, inf = 1e9 + 7;
const LL INF = 5e17 + 10, mod = 1e9 + 7;
class l
{
public :
l(){}
l(const l &a)
{
x = a.x;
}
int x;
};
class Array
{
public:
Array(int count);
Array(const Array &Arr);
~Array();
void setcount(int count);
int getcount();
void setm_pArr();
void getm_pArr();
void printAddr();
private:
int m_count;
int *m_pArr;
};
Array::Array(int count)
{
m_count = count;
m_pArr = new int[m_count];
setm_pArr();
cout << "Array" << endl;
}
/*Array::Array(const Array &Arr)// 浅拷贝
{
m_pArr = Arr.m_pArr;
this->m_count = Arr.m_count;
cout << "Array&" << endl;
}*/
Array::Array(const Array &Arr)//深拷贝
{
m_count = Arr.m_count;
m_pArr = new int[m_count];
for (int i = 0; i < m_count; i++)
m_pArr[i] = Arr.m_pArr[i];
cout << "Array&" << endl;
}
void Array::setcount(int count)
{
this->m_count = count;
}
int Array::getcount()
{
return this->m_count;
}
void Array::setm_pArr()
{
for (int i = 0; i < m_count; i++)
m_pArr[i] = i;
}
void Array::getm_pArr()
{
for (int i = 0; i < m_count; i++)
cout << m_pArr[i] << " ";
cout << endl;
}
Array::~Array()
{
this->printAddr();
delete[]m_pArr;
this->printAddr();
m_pArr = NULL;
cout << "~Array" << " " << this->m_count << endl;
}
void Array::printAddr()
{
cout << "m_pArr" << " " << m_pArr << endl;
}
int main()
{
Array arr1(5);
Array arr2 = arr1;
arr1.getm_pArr();
arr2.getm_pArr();
return 0;
}