4.类和对象
C++面向对象的三大特性:封装、继承、多态
C++认为万事万物都皆为对象,对象上有其属性和行为
具有相同性质的对象,可以抽象为类
4.2.5 深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作。
深拷贝:在堆区重新申请空间
,进行拷贝操作。
示例:
#include<iostream>
using namespace std;
class Person {
public:
Person() {
cout << "Person的默认构造函数" << endl;
}
Person(int age,int height) {
cout << "Person的有参构造函数" << endl;
m_age = age;
m_height = new int(height);
}
Person(const Person &p) {
cout << "Person的拷贝构造函数" << endl;
m_age = p.m_age;
}
~Person() {
cout << "Person的析构函数" << endl;
//析构代码的作用:将堆区开辟的数据进行释放
if (m_height != NULL) {
delete m_height;
m_height = NULL;
}
}
int m_age;
int* m_height;//将身高的数据 开辟到堆区
};
void test01() {
Person p1(18,180);
cout << "p1的年龄:" << p1.m_age << ",p1的身高:" << *p1.m_height << endl;
Person p2(p1);
cout << "p2的年龄:" << p2.m_age << ",p2的身高:" << *p2.m_height << endl;
}
int main() {
test01();
return 0;
}
析构函数:将堆区开辟数据做释放操作
出现异常的原因:由于是浅拷贝,造成堆区内存重复释放
编译器提供的拷贝构造函数,会做浅拷贝,即进行简单的赋值拷贝操作。
浅拷贝存在的问题就是:在对内存进行释放时,会对堆区的存放数据的内存进行重复释放。
浅拷贝的问题,要利用深拷贝进行解决。
深拷贝:重新在堆区再申请一块内存,用来存放相同的数据,指针指向重新申请的内存地址
深拷贝代码
m_height = new int(*p.m_height);//深拷贝
Person(const Person &p) {
cout << "Person的拷贝构造函数" << endl;
m_age = p.m_age;
//m_height = p.m_height; 编译器默认实现代码
m_height = new int(*p.m_height);//深拷贝
}
完整代码
#include<iostream>
using namespace std;
class Person {
public:
Person() {
cout << "Person的默认构造函数" << endl;
}
Person(int age,int height) {
cout << "Person的有参构造函数" << endl;
m_age = age;
m_height = new int(height);
}
Person(const Person &p) {
cout << "Person的拷贝构造函数" << endl;
m_age = p.m_age;
//m_height = p.m_height; 编译器默认实现代码
m_height = new int(*p.m_height);//深拷贝
}
~Person() {
cout << "Person的析构函数" << endl;
//析构代码的作用:将堆区开辟的数据进行释放
if (m_height != NULL) {
delete m_height;
m_height = NULL;
}
}
int m_age;
int* m_height;//将身高的数据 开辟到堆区
};
void test01() {
Person p1(18,180);
cout << "p1的年龄:" << p1.m_age << ",p1的身高:" << *p1.m_height << endl;
Person p2(p1);
cout << "p2的年龄:" << p2.m_age << ",p2的身高:" << *p2.m_height << endl;
}
int main() {
test01();
return 0;
}
如果属性有在堆区开辟的,一定要自己写拷贝构造函数,防止浅拷贝带来的问题。