• 【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

    在这里插入图片描述

  • 相关阅读:
    Unity UI自适应
    SLAM中的二进制词袋生成过程和工作原理
    web测试——业务测试1
    【Hive-小文件合并】Hive外部分区表利用Insert overwrite的暴力方式进行小文件合并
    Servlet工作原理
    【课设资源分享】基于jsp的俱乐部会员系统
    乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具
    关于电影的HTML网页设计-威海影视网站首页-电影主题HTM5网页设计作业成品
    ABAP datum_range中的四个组件的作用
    NetSuite 关闭期间的销售订单可否修改
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132887194