C++ 编译器 发现 使用 匿名对象 时 , 会根据 匿名对象 的用法 , 决定对 匿名对象的 处理 ;
" 匿名对象 " 的 作用域 仅限于其所在的 表达式 , 这句表达式 执行完毕后 , 匿名对象 自动销毁 ;
这里讨论一种特殊情况 , 创建 匿名对象 后 , 在表达式执行完毕之前 , 使用 匿名对象 为 普通变量 进行初始化操作 , 即可保留该 匿名对象 , 在之后的代码中 , 仍然可以访问该匿名对象 ;
下面介绍下上述操作的原理 ;
先 创建一个 " 匿名对象 " , 然后将匿名对象 赋值给 Student s 变量 ;
// 创建匿名对象, 并将其赋值给变量
Student s = Student(12, 170);
C++ 编译器识别到上述操作后 , 会将 匿名对象 转为 变量名为 s 的 实例对象 ;
此时 即使该语句 执行完毕 , 创建的 匿名对象 , 被转换为普通对象 , 自然就不会被销毁 ;
这里 将 " 匿名对象 " 直接转为 " 普通对象 " , 这里只是进行单纯的转换 , 不涉及拷贝复制的情况 ;
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "调用带参数构造函数" << endl;
}
// 打印学生信息
void printfInfo()
{
cout << "学生信息 : 年龄 = " << m_age << " , 身高 = " << m_height << endl;
}
Student(const Student& s)
{
m_age = s.m_age;
m_height = s.m_height;
cout << "调用拷贝构造函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
int main()
{
// 创建匿名对象, 并将其 初始化 给变量
Student s = Student(12, 170);
// 调用对象方法
s.printfInfo();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
调用带参数构造函数
学生信息 : 年龄 = 12 , 身高 = 170
Press any key to continue . . .
" 匿名对象 " 创建后有两种用法 , 一种是用于为 变量 进行初始化操作 , 该操作直接将 匿名对象 转为 普通对象 , 不涉及 匿名对象 销毁操作 ;
另外一种就是将 匿名对象 赋值给 已存在的变量 , C++ 编译器会进行如下处理 :
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "调用带参数构造函数" << endl;
}
// 打印学生信息
void printfInfo()
{
cout << "学生信息 : 年龄 = " << m_age << " , 身高 = " << m_height << endl;
}
Student(const Student& s)
{
m_age = s.m_age;
m_height = s.m_height;
cout << "调用拷贝构造函数" << endl;
}
~Student()
{
cout << "调用析构函数 : m_age = " << m_age << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
int main()
{
// 创建普通对象
Student s(18, 180);
// 创建匿名对象, 并将其 赋值 给变量
s = Student(12, 170);
// 调用对象方法
s.printfInfo();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
调用带参数构造函数
调用带参数构造函数
调用析构函数 : m_age = 12
学生信息 : 年龄 = 12 , 身高 = 170
Press any key to continue . . .