当前位置 博文首页 > Zhi Zhao的博客:C++入门基础教程(五):类和对象(中)

    Zhi Zhao的博客:C++入门基础教程(五):类和对象(中)

    作者:[db:作者] 时间:2021-08-08 13:08

    前言

    博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读,今后的一段时间我将持续更新C++入门系列博文,想学习C++的朋友可以关注我,希望大家有所收获。

    2 对象特性

    续接上一节:C++入门基础教程(四):类和对象(上)

    2.5 深拷贝与浅拷贝

    浅拷贝:简单的复制拷贝操作(由编译器提供),易导致堆区的内存重复释放;

    #include <iostream>
    using namespace std;
    
    class Person
    {
    public:
    	Person(int age,int height)    // 有参构造函数
    	{
    		m_Age = age;
    		m_Height = new int(height);  // 堆区开辟的数据,需要手动释放
    		cout << "Person有参构造函数的调用" << endl;
    	}
    
    	~Person()   // 析构函数
    	{
    		// 将堆区开辟的数据做释放操作
    		if (m_Height != NULL)
    		{
    			delete m_Height;
    			m_Height = NULL;
    		}
    		cout << "Person析构函数的调用" << endl;
    	}
    
    	int m_Age;        // 年龄
    	int *m_Height;    // 身高
    };
    
    void test()
    {
    	Person p1(18, 170);
    	cout << "p1的年龄为:" << p1.m_Age << 
    		" 身高:" << *p1.m_Height << endl;
    	
    	Person p2(p1);   // 会调用编译器提供的拷贝构造函数
    	cout << "p2的年龄为:" << p2.m_Age << 
    		" 身高:" << *p2.m_Height << endl;
    }
    
    int main()
    {
    	test();
    	system("pause");
    	return 0;
    }

    执行语句 Person p2(p1); 会调用编译器提供的拷贝构造函数,该函数做的是浅拷贝,即将p1这个对象的属性复制一份给p2。由于new int(height) 的数据会存放在堆区,需要程序员手动释放,因此在上述析构函数中做数据的释放操作时,先释放p2的指针m_Height指向的内存,再释放p1的指针m_Height指向的内存(p1和p2是局部变量,存放在栈区,遵循后进先出的原则),但是这两个对象的指针m_Height指向的是同一块内存地址,这样就导致堆区的内存重复释放,程序不能成功运行。

    浅拷贝
    cs