构造函数初始化列表 总结 :
调用 类名(构造函数参数)
创建的是 匿名对象 ;
匿名对象 的 生命周期 仅限于 该 匿名对象 所在的 代码表达式 ,
一旦 该行代码执行完毕 , 匿名对象就会被销毁 ;
匿名对象 的 生命周期 仅限于 那一行代码 中 ;
匿名对象 生命周期 分以下几种情况 :
下面的代码中 , 在 fun 函数中 , 调用 Student(18, 180) 代码 , 创建 Student 类型的匿名对象 , 匿名对象的生命周期 只存在于 这一行代码 , 该行代码执行完毕后 , 匿名对象 就会被 析构 ;
void fun()
{
cout << "创建匿名对象之前" << endl;
// 创建 Student 类型的匿名对象
// 匿名对象的生命周期 只存在于 这一句话
Student(18, 180);
cout << "创建匿名对象之后" << endl;
}
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "执行 Student 的构造函数" << endl;
}
~Student()
{
cout << "执行 Student 的析构函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
void fun()
{
cout << "创建匿名对象之前" << endl;
// 创建 Student 类型的匿名对象
// 匿名对象的生命周期 只存在于 这一句话
Student(18, 180);
cout << "创建匿名对象之后" << endl;
}
int main()
{
// 该函数中定义了一个匿名对象
fun();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
创建匿名对象之前
执行 Student 的构造函数
执行 Student 的析构函数
创建匿名对象之后
Press any key to continue . . .
构造函数中 调用 构造函数 是危险行为 ;
构造函数 中调用 构造函数 , 并不会为本对象进行初始化操作 ;
构造函数 的调用方式 , 天然就会创建一个 匿名对象 ,
如果 没有变量 接收 这个 匿名对象 , 该匿名对象 在 本行表达式执行完毕后 , 就会被销毁 ;
下面的代码中 ,
先定义 有参构造函数 ,
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "执行 Student 的构造函数" << endl;
}
然后 , 在无参的 构造函数中 , 调用 有参构造函数 ;
// 构造函数中 调用 构造函数 是危险行为
Student()
{
// 构造函数中调用构造函数
// 此时 创建 的是匿名对象
// 如果 匿名对象 没有被接收
// 就会在 本代码 执行结束后 立刻销毁
Student(18, 180);
}
Student(18, 180) 调用方式 , 会创建一个 匿名对象 ;
如果 匿名对象 没有被接收 , 就会在 本代码 执行结束后 立刻销毁 ;
本实例对象 的成员变量实际上没有进行初始化 , 当前为随机值 ;
这也是 打印 对象成员变量 的值为随机值 的原因 ;
s.m_age = -858993460 , s.m_height = -858993460
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "执行 Student 的构造函数" << endl;
}
// 构造函数中 调用 构造函数 是危险行为
Student()
{
// 构造函数中调用构造函数
// 此时 创建 的是匿名对象
// 如果 匿名对象 没有被接收
// 就会 本代码 执行结束后 立刻销毁
Student(18, 180);
}
~Student()
{
cout << "执行 Student 的析构函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
void fun()
{
// 创建 Student 类型的匿名对象
// 匿名对象的生命周期 只存在于 这一句话
Student(18, 180);
}
int main()
{
// 该函数中定义了一个匿名对象
//fun();
Student s;
cout << "s.m_age = " << s.m_age << " , s.m_height = " << s.m_height << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
执行 Student 的构造函数
执行 Student 的析构函数
s.m_age = -858993460 , s.m_height = -858993460
Press any key to continue . . .