构造函数(Constructor)

构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作

特点

函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数

一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象

struct Person {
	int m_age;

    // 构造函数
	Person() {
		cout << "Person()" << endl;
		// this->m_age = 0;
		memset(this, 0, sizeof(Person));
	}
    // 构造函数
	Person(int age) {
		cout << "Person(int age)" << endl;
		this->m_age = age;
	}
};

注意

通过malloc分配的对象不会调用构造函数

一个广为流传的、很多教程\书籍都推崇的错误结论: 默认情况下,编译器会为每一个类生成空的无参的构造函数

正确理解:在某些特定的情况下,编译器才会为类生成空的无参的构造函数

构造函数的调用

// 全局区
Person g_person1; // Person()
Person g_person2(); // 这是一个函数声明,函数名叫g_person2,无参,返回值类型是Person
Person g_person3(10); // Person(int age)


int main() {
	// 栈空间
	Person person1; // Person()
	Person person2(); // 函数声明,函数名叫person2,无参,返回值类型是Person
	Person person3(20);  // Person(int age)

	// 堆空间
	Person *p1 = new Person; // Person()
	Person *p2 = new Person(); // Person()
	Person *p3 = new Person(30);  // Person(int age)

	getchar();
	return 0;
}

默认情况下,成员变量的初始化

struct Person {
	int m_age;

	/*Person() {
		cout << "Person()" << endl;
		this->m_age = 0;
	}*/
};

全局区(成员变量初始化为0)

Person g_person;
int g_age;// 默认为0

栈空间和堆空间

int main() {
	// 栈空间(成员变量没有初始化)
	Person person;

	// 堆空间
	Person *p1 = new Person; // 成员变量没有初始化
	Person *p2 = new Person(); // 成员变量有初始化
    Person *p3 = new Person[3];//成员变量没有初始化
    Person *p4 = new Person[]();// 3个Perso对象的成员变量都初始化为0
    Person *p5 = new Person[3]{};// 3个Perso对象的成员变量都初始化为0

	cout << "g_person " << g_person.m_age << endl;
	cout << "p1 " << p1->m_age << endl;
	cout << "p2 " << p2->m_age << endl;

	getchar();
	return 0;
}

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