当前位置 博文首页 > Zhi Zhao的博客:C++入门基础教程(五):类和对象(中)
博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读,今后的一段时间我将持续更新C++入门系列博文,想学习C++的朋友可以关注我,希望大家有所收获。
续接上一节:C++入门基础教程(四):类和对象(上)
浅拷贝:简单的复制拷贝操作(由编译器提供),易导致堆区的内存重复释放;
#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