cpp_constructor - ShenYj/ShenYj.github.io GitHub Wiki
构造函数(也叫构造器),一般在对象创建的时候自动调用,完成对象的初始化工作
-
特点
-
函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数
struct Person { int m_age; Person() { } };
-
一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象
struct Person { int m_age; Person() { m_age = 0; cout << "Person()" << endl; } Person(int age) { m_age = age; cout << "Person(int age)" << endl; } }; Person g_person0; // Person() Person g_person1(); // 函数声明 不会创建对象 Person g_person2(10); // Person(int) int main() { Person person0; // Person() Person person1(); // 函数声明 不会创建对象 Person person2(20); // Person(int) Person *p0 = new Person; // Person() Person *p1 = new Person(); // Person() Person *p2 = new Person(30); // Person(int) /* 4个无参,3个有参,一共创建了7个Person对象 */ getchar(); return 0; }
-
-
注意
-
通过malloc分配的对象不会调用构造函数
struct Person { int m_age; }; int main() { /// 不会调用构造函数 Person *p = (Person *)malloc(sizeof(Person)); p->m_age = 10; free(p); return 0; }
-
在某些特定的情况下,编译器才会为类生成空的无参的构造函数, C++ 中取决于类实例化过程中是否有初始化工作需要执行
-
此时汇编中不会出现 call Person:: Person
struct Person { int m_age; }; int main() { Person p; p.m_age = 10; return 0; }
-
此时汇编中会出现 call Person:: Person
struct Person { int m_age = 0; }; int main() { Person p; p.m_age = 10; return 0; }
区别是成员变量初始有值, 在初始化时需要初始化成员变量
构造函数调用构造函数,不能直接调用,必须通过初始化列表调用, 参考笔记: 初始化列表