玩命加载中 . . .

拷贝构造函数


析构函数

#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函数结束时,又会调用析构函数释放内存,这样就会发生错误。
原因在于,传递参数时是浅复制,没有对指针所指内容进行复制,导致两个指针指向同一个地方,所以拷贝构造函数就需要对指针所指内容进行复制。


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录