特点:1.定义和声明不写返回值,函数名与类名称相同。
2.在创建对象的时候自动调用构造函数来为完成对象的初始化工作。
3.构造函数可以有多个参数,即部分成员变量传参赋值。
4.构造函数可以重载,即可以有多个构造函数(函数名相同,参数个数和类型不同)
5.初始化顺序按照成员变量的声明顺序 与构造函数赋值顺序无关。
6.如果自定义了构造函数,编译器默认使用自定义构造函数来初始化。
7.通过malloc分配的对象不会生成构造函数,但通过new分配的对象会生成构造函数。
如何理解--malloc是从C语言继承过来的语法,C语言没有对象概念,则也不会调用构造函数
8.如何理解默认情况下,编译器会为类生成一个空的无参构造函数?
不完全正确,与虚函数有关,见后文验证
9.注意区分无参构造函数和返回值为类的函数。
10.如果自定义了构造函数,除了全局区,其他区域都得自己手动初始化成员变量。
Person person0; // 调用无参构造函数
Person person1(); // 函数声明
Person person2(20); // 调用有参构造函数
构造函数的基本使用
class Person {
public:
int m_age;
int m_height;
Person() { //无参数构造函数
m_age = 0;
m_height = 0;
cout << "Person()" << endl;
}
Person(int age, int height) { //有参构造函数 函数重载
m_age = age;
m_height = height;
cout << "Person(int age)" << endl;
}
void display(){
cout << "m_age is" << m_age << endl;
cout << "m_height is" << m_height << endl;
}
private:
};
int main() {
Person person0; // Person()
person0.display();
Person person2(20, 20); // Person(int)
person2.display();
return 0;
}
代码结果
验证默认情况下,编译器会为类生成一个空的无参构造函数
情况一、没有在类中对成员变量赋初值,则不会调用构造函数。
class Person {
public:
int m_age;
int m_height;
private:
};
int main() {
Person a; //从汇编中可以看出 没有调用call构造函数的指令
a.m_age = 10;
/*Person a;
a.m_age = 10;
00E6404E C7 45 F4 0A 00 00 00 mov dword ptr[a], 0Ah*/
return 0;
}
情况二、在类中对成员变量赋初值,则会调用构造函数。
class Person {
public:
int m_age=5;
int m_height;
private:
};
int main() {
Person a; //从汇编中可以看出 调用call构造函数的指令
//Person a;
//007837B8 8D 4D F0 lea ecx, [a]
// 007837BB E8 54 DD FF FF call Person::Person(0781514h)
// a.m_age = 10;
//007837C0 C7 45 F0 0A 00 00 00 mov dword ptr[a], 0Ah
a.m_age = 10;
return 0;
}
验证:自定义了构造函数,除了全局区,其他区域都得自己手动初始化成员变量。
//使用默认构造函数
class Person {
public:
int m_age;
int m_height;
private:
};
Person a; //位于全局区
int main() {
// 栈区 结果 运行报错,未初始化
// Person b; //在main函数中,故位于栈区
Person *c = new Person; //位于堆区
Person *d = new Person(); //位于堆区
cout << a.m_age << endl;
// cout << b.m_age << endl;
cout << c->m_age << endl;
cout << d->m_age << endl;
delete c;
delete d;
return 0;
}
运行结果:
//使用自定义的空构造函数
class Person {
public:
int m_age;
int m_height;
Person(){ //自定义空构造函数
}
private:
};
Person a; //位于全局区 成员初始化为0 全局变量默认值都为0
int g_age; //初始值默认为0
int main() {
// Person b; //在main函数中,故位于栈区 结果 运行报错,未初始化
Person *c = new Person; //位于堆区 没有初始化成员
Person *d = new Person(); //位于堆区 没有初始化成员
cout <<"全局区a.m_age的值:"<< a.m_age << endl;
//cout <<"栈区 b.m_age的值:"<< << b.m_age << endl;
cout << "new Person 堆区c.m_age的值:" << c->m_age << endl;
cout << "new Person() 堆区d.m_age的值:" << d->m_age << endl;
delete c;
delete d;
return 0;
}
参考:30小时快速精通C++编程和外挂实战课程 07-03构造函数(1)