析构函数
#include <iostream>
using namespace std;
class Human
{
public:
Human(string name, int age, const int& val);
~Human();
private:
string _name;
int _age;
int* _ptr = nullptr;
};
Human::Human(string name, int age, const int& val) {
this->_name = name;
this->_age = age;
if (&val != nullptr) {
this->_ptr = new int;
*this->_ptr = val;
}
else
this->_ptr = nullptr;
}
Human::~Human() {
if (this->_ptr != nullptr) {
cout << "delete ptr" << endl;
delete this->_ptr;
}
}
int main(int argc, char const *argv[])
{
int num1 = 100;
Human kavin("kavin", 23, num1);
kavin.setAge(34);
kavin.Introduce();
return 0;
}
I'm kavin, and I'm 34 years old.
delete ptr // 调用了析构函数
类成员变量里有指针,程序结束时应该要释放,所以需要重载析构函数,类里面只有一个析构函数。
拷贝构造函数
#include <iostream>
using namespace std;
class Human
{
// 拷贝构造函数
Human::Human(const Human& copySource) {
this->_name = copySource._name;
this->_age = copySource._age;
cout << "copy constructor" << endl;
if (copySource._ptr != nullptr) {
this->_ptr = new int;
*this->_ptr = *copySource._ptr;
}
else
this->_ptr = nullptr;
}
void UseHuman(Human input) {
input.Introduce();
}
int main(int argc, char const *argv[])
{
int num1 = 100;
Human kavin("kavin", 23, num1);
kavin.setAge(34);
kavin.Introduce();
UseHuman(kavin);
return 0;
}
如果没有拷贝构造函数,在UseHuman
函数完成之后,类中的指针所指的空间就会被释放,而在main
函数结束时,又会调用析构函数释放内存,这样就会发生错误。
原因在于,传递参数时是浅复制,没有对指针所指内容进行复制,导致两个指针指向同一个地方,所以拷贝构造函数就需要对指针所指内容进行复制。