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 . . .

【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )-LMLPHP





二、将 " 匿名对象 " 赋值给变量




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 . . .

【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )-LMLPHP

09-15 12:00