cpp_member_init - ShenYj/ShenYj.github.io GitHub Wiki

成员变量初始化

如果自定义了构造函数,除了全局区,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化

没有自定义构造函数时

#include <iostream>
using namespace std;

struct Person {
    int m_age;
};

// 全局区:成员变量初始化为 0
Person g_person;

void test() {
    // 栈空间:没有初始化成员变量
    // Person person; 

    // 堆空间:没有初始化成员变量
    Person *p0 = new Person;
    // 堆空间:成员变量初始化为0
    Person *p1 = new Person();
 
    cout << g_person.m_age << endl;
    // cout << person.m_age << endl; 编译报错
    cout << p0->m_age << endl;
    cout << p1->m_age << endl;
}

有自定义构造函数时

#include <iostream>
using namespace std;

struct Person {
    int m_age;

    /// 有自定义构造函数, 但是什么都不做
    Person() {

    }
};

// 全局区:成员变量初始化为 0
Person g_person;

void test() {

    // 堆空间:没有初始化成员变量
    Person *p0 = new Person;
    // 堆空间:没有初始化成员变量, 因为有了自定义构造函数,不再为其成员变量默认初始化
    Person *p1 = new Person();
 
    cout << g_person.m_age << endl;
    cout << p0->m_age << endl;
    cout << p1->m_age << endl;
}

全局区的成员变量会默认初始化为 0, C语言默认如此,与有没有构造函数无关 堆空间对象创建成员变量的初始化 参考 new 的几种初始化区别 堆空间内存管理

  • 快速简单的成员变量初始化

    struct Person {
        
        int m_age;
    
        Person() {
            memset(this, 0, sizeof(Person));
        }
    };
⚠️ **GitHub.com Fallback** ⚠️