C++之拷贝构造函数、深拷贝、浅拷贝

时间:2021-05-02 19:51:06
 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  /*
    CopyConstructor.cpp
    Author: Michael Joessy
    Date: 2017-06-07
    Marks:
    如果没有自定义拷贝构造函数,则系统会自动生成一个默认的拷贝构造函数(什么也不输出)。
    当采用直接初始化或复制初始化实例化对象时,系统自动调用拷贝构造函数。

    对象间的拷贝分为:深拷贝 和 浅拷贝
    浅拷贝:只是将数据成员的值进行了拷贝
    深拷贝:涉及到指针时,特别注意!
    在某些状况下,类内成员变量需要动态开辟堆内存,如果实行浅拷贝,如A = B。
    这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。
    这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
*/


#include <iostream>
#include <string>
using namespace std;


class Student
{
public:
    
//无参构造函数,即默认构造函数
    Student()
    {
        cout << 
"Student" << endl;
    }
    
//定义拷贝构造函数
    //定义格式:类名(const 类名& 变量名)
    Student(const Student &stu)
    {
        cout << 
"Copy Student" << endl;
    }
protected:
private:
    string m_strName;
};


/* 深拷贝和浅拷贝可以简单理解为:
    如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝;
    反之,没有重新分配资源,就是浅拷贝。
*/

class MyArray
{
public:
    MyArray()
    {
        m_nCount = 
5;
        m_pArr = 
new int[m_nCount];
    }
    MyArray(
const MyArray &arr)
    {
        m_nCount = arr.m_nCount;
        
//m_pArr = arr.m_pArr;          //浅拷贝,隐患大
        m_pArr = new int[m_nCount];     //深拷贝,重新申请另一块内存
        for (int i = 0; i < m_nCount; i++)
        {
            m_pArr[i] = arr.m_pArr[i];
        }
    }
protected:
private:
    
int m_nCount;
    
int *m_pArr;
};

int main(void)
{
    
//拷贝构造函数
    Student std1;
    Student std2 = std1;
    Student std3(std1);

    
//深拷贝和浅拷贝
    MyArray arr1;
    MyArray arr2 = arr1;

    cin.get();
    
return 0;
}