1.构造函数
构造函数,也叫构造器,在对象创建的时候被系统自动调用,一般用于完成对象的初始化工作。
构造函数的函数名与类名相同,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数。
一旦自定义了构造函数,就必须用其中一个自定义的构造函数来初始化对象。
#include <iostream>
using namespace std;
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_p1; // 调用Person()
Person g_p2(); // 这是一个函数声明,函数名叫g_p2,返回值类型是Person,无参
Person g_p3(20); // 调用Person(int)
int main()
{
Person p1; // 调用Person()
Person p2(); // 这是一个函数声明,函数名叫p2,返回值类型是Person,无参
Person p3(20); // 调用Person(int)
Person* p4 = new Person; // 调用Person()
Person* p5 = new Person(); // 调用Person()
Person* p6 = new Person(30); // 调用Person(int)
return 0;
}
2.无参构造函数的调用
#include <iostream>
using namespace std;
class Student
{
public:
int age;
Student()
{
age = 0;
cout << "Student()" << endl;
}
Student(int v)
{
age = v;
cout << "Student(int v)" << endl;
}
};
int main()
{
// 调用无参构造函数
Student stu1 = Student();
Student stu2;
Student stu3 = Student{};
Student stu4{};
Student stu5 = {};
return 0;
}
上面代码在 Visual Studio 中反汇编的结果如下:
3.带参构造函数的调用
#include <iostream>
using namespace std;
class Student
{
public:
int age;
Student()
{
age = 0;
cout << "Student()" << endl;
}
Student(int v)
{
age = v;
cout << "Student(int v)" << endl;
}
};
int main()
{
// 调用带参构造函数
Student stu6 = Student(18);
Student stu7(20);
Student stu8 = Student{22};
Student stu9{24};
Student stu10 = {26};
return 0;
}
上面代码在 Visual Studio 中反汇编的结果如下:
4.成员变量的初始化
默认情况下,成员变量的初始化如下:
#include <iostream>
using namespace std;
struct Person
{
int m_age;
};
// 全局/静态存储区
Person g_p1; // 成员变量初始化为0
int main()
{
// 栈区
Person p1; // 成员变量不会被初始化
// 堆区
Person* p2 = new Person; // 成员变量不会被初始化
Person* p3 = new Person(); // 成员变量初始化为0
Person* p4 = new Person[3]; // 成员变量不会被初始化
Person* p5 = new Person[3](); // 3个Person对象的成员变量都初始化为0
Person* p6 = new Person[3]{}; // 3个Person对象的成员变量都初始化为0
return 0;
}
如果自定义了构造函数,除了 全局/静态存储区
,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化。