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



    C++ 编译器 发现 使用 匿名对象 时 , 会根据 匿名对象 的用法 , 决定对 匿名对象的 处理 ;

    • 匿名对象单独使用 : 如果只是单纯的使用 匿名对象 , 没有涉及到 将 匿名对象 赋值给其它变量 , 就会在表达式执行完毕后 , 销毁匿名对象 ;
    • 使用匿名对象初始化变量 : 如果 创建 匿名对象 后 , 还使用 匿名对象 初始化 变量 , 此时 编译器 会将 匿名对象 转为 普通对象 , 不会销毁该匿名对象 , 该对象会一直持续到该作用域结束 ;
    • 使用匿名对象为变量赋值 : 如果 创建 匿名对象 后 , 还使用 匿名对象 为 已存在的变量 赋值 , 此时 编译器 会将 匿名对象 的值赋值给 已存在的变量 , 并且立刻销毁该匿名对象 ;




    一、将 " 匿名对象 " 初始化给变量




    1、使用匿名对象进行初始化操作


    " 匿名对象 " 的 作用域 仅限于其所在的 表达式 , 这句表达式 执行完毕后 , 匿名对象 自动销毁 ;

    这里讨论一种特殊情况 , 创建 匿名对象 后 , 在表达式执行完毕之前 , 使用 匿名对象 为 普通变量 进行初始化操作 , 即可保留该 匿名对象 , 在之后的代码中 , 仍然可以访问该匿名对象 ;

    下面介绍下上述操作的原理 ;


    2、匿名对象转为普通对象


    先 创建一个 " 匿名对象 " , 然后将匿名对象 赋值给 Student s 变量 ;

    // 创建匿名对象, 并将其赋值给变量
    Student s = Student(12, 170);
    
    • 1
    • 2

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    执行结果 :

    调用带参数构造函数
    学生信息 : 年龄 = 12 , 身高 = 170
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述





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




    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    执行结果 :

    调用带参数构造函数
    调用带参数构造函数
    调用析构函数 : m_age = 12
    学生信息 : 年龄 = 12 , 身高 = 170
    Press any key to continue . . .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

  • 相关阅读:
    python-(3)条件判断与循环语句
    安卓开发2年,入职字节跳动那天我哭了,被裁后奋战3个月终拿下
    《C和指针》笔记21:表达式求值
    金融数据合规管理研究
    【Linux】详细介绍Linux重入不可重入带例子
    Java 从零开始实现一个画图板、以及图像处理功能,代码可复现
    linux统计日志文件中IP出现的次数,显示次数最多的前十,grep,cat,sort,uniq,head,cut,awk
    Mapbox 与 Babylon.js 可视化 给车身添加贴图
    [深入研究4G/5G/6G专题-46]: L3信令控制-2-软件功能与流程的切分-DU网元的信令
    聊聊微服务治理体系
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132887194