文章目录
C++ 编译器 发现 使用 匿名对象 时 , 会根据 匿名对象 的用法 , 决定对 匿名对象的 处理 ;
- 匿名对象单独使用 : 如果只是单纯的使用 匿名对象 , 没有涉及到 将 匿名对象 赋值给其它变量 , 就会在表达式执行完毕后 , 销毁匿名对象 ;
- 使用匿名对象初始化变量 : 如果 创建 匿名对象 后 , 还使用 匿名对象 初始化 变量 , 此时 编译器 会将 匿名对象 转为 普通对象 , 不会销毁该匿名对象 , 该对象会一直持续到该作用域结束 ;
- 使用匿名对象为变量赋值 : 如果 创建 匿名对象 后 , 还使用 匿名对象 为 已存在的变量 赋值 , 此时 编译器 会将 匿名对象 的值赋值给 已存在的变量 , 并且立刻销毁该匿名对象 ;
一、将 " 匿名对象 " 初始化给变量
1、使用匿名对象进行初始化操作
" 匿名对象 " 的 作用域 仅限于其所在的 表达式 , 这句表达式 执行完毕后 , 匿名对象 自动销毁 ;
这里讨论一种特殊情况 , 创建 匿名对象 后 , 在表达式执行完毕之前 , 使用 匿名对象 为 普通变量 进行初始化操作 , 即可保留该 匿名对象 , 在之后的代码中 , 仍然可以访问该匿名对象 ;
下面介绍下上述操作的原理 ;
2、匿名对象转为普通对象
先 创建一个 " 匿名对象 " , 然后将匿名对象 赋值给 Student s 变量 ;
// 创建匿名对象, 并将其赋值给变量
Student s = Student(12, 170);
C++ 编译器识别到上述操作后 , 会将 匿名对象 转为 变量名为 s 的 实例对象 ;
此时 即使该语句 执行完毕 , 创建的 匿名对象 , 被转换为普通对象 , 自然就不会被销毁 ;
这里 将 " 匿名对象 " 直接转为 " 普通对象 " , 这里只是进行单纯的转换 , 不涉及拷贝复制的情况 ;
3、代码示例 - 将 " 匿名对象 " 赋值给变量
代码示例 :
#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 . . .
二、将 " 匿名对象 " 赋值给变量
1、使用匿名对象进行赋值操作
" 匿名对象 " 创建后有两种用法 , 一种是用于为 变量 进行初始化操作 , 该操作直接将 匿名对象 转为 普通对象 , 不涉及 匿名对象 销毁操作 ;
另外一种就是将 匿名对象 赋值给 已存在的变量 , C++ 编译器会进行如下处理 :
- 首先 , 读取 匿名对象 的值 , 将值赋值给已存在的变量 ,
- 然后 , 销毁 匿名对象 , 只保留被赋值的 普通变量 ;
2、代码示例 - 使用匿名对象进行赋值操作
代码示例 :
#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 . . .