zoukankan      html  css  js  c++  java
  • 构造函数-析构函数-声明与实现分离

    构造函数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;
    }
    
    • 头文件(源文件)-右键添加类:头文件有声明,源文件有实现
  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/sec875/p/12269458.html
Copyright © 2011-2022 走看看