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