构造函数-析构函数-声明与实现分离

构造函数constructor

  • 构造函数(构造器),对象创建时自动调用,一般用于完成对象的初始化工作
  • 构造函数:函数名和类名一样,没有返回值
#include <iostream>
using namespace std;

struct Person {
    int m_age;

    Person() {    //这个就是构造函数,会自动调用
        m_age = 0;    //
        cout << "Person()" << endl;
    }
};

int main() {
    Person person;    //这里只是定义对象,它就自己调用了构造函数
    Person person2;
    Person person3;

    getchar();
    return 0;
}
  • 通过malloc分配的对象不会调用构造函数
#include <iostream>
using namespace std;

struct Person {
    int m_age;

    Person() {    //这个就是构造函数,会自动调用
        m_age = 0;    //
        cout << "Person()" << endl;
    }
};

int main() {
    Person *p = new Person;    //new对象的会调用构造函数
    
    delete p;

    
    Person *p = (Person *) malloc(sizeof(Person));    //malloc申请的不能调用构造函数,这是C语言时代用的函数
    p->m_age = 10;

    free(p);

    getchar();
    return 0;
}
  • 所有成员变量初始化为0
struct Person {
    int m_age;

    Person() {
        memset(this, 0, sizeof(Person));
    }
};

析构函数Destructor

  • 也叫析构器,在对象销毁时自动调用,一般用于完成对象的清理工作
struct Person {
    int m_age;

    // 用来做初始化的工作
    Person() {
        cout << "Person::Person()" << endl;
    }

    // 用来做内存清理的工作
    ~Person() {        //这就是析构函数,死了善后的函数
        cout << "~Person" << endl;
    }
};
  • 内存泄露:该释放的内存并没有得到释放
struct Person {
    int m_age;
    Car *m_car;

    // 用来做初始化的工作
    Person() {
        m_age = 0;
        m_car = new Car();    //这里向堆空间new了空间,需要写回收的代码清理掉,如果没有就发生内存泄露
    
        cout << "Person::Person()" << endl;
    }

    // 用来做内存清理的工作
    ~Person() {        //这就是析构函数,死了善后的函数
        delete m_car;    //销毁堆空间,防止内存泄露
        cout << "~Person" << endl;
    }
    
};

声明与实现分离

class Person {    //只声明
private:
    int m_age;
public:
    void setAge(int age);
    int getAge();
    Preson();
    ~Person();
};

void Person::setAge(int age) {    //类的实现
    m_age = age;
}

int Person::getAge(int age) {    //类的实现
    return m_age;
}

Person::Person() {
    m_age = 0;
}

Person::~Person() {
    m_age = 0;
}

int main() {

    getchar();
    return 0;
}
  • 头文件(源文件)-右键添加类:头文件有声明,源文件有实现
原文地址:https://www.cnblogs.com/sec875/p/12269458.html