• 【C++】拷贝构造函数调用时机 ① ( 使用一个对象初始化另外一个对象 | 将一个对象赋值给另外一个对象 )






    一、拷贝构造函数调用时机




    C++ 语言中的 拷贝构造函数 是 C++ 类中的 特殊构造函数 ,

    其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本 ;

    拷贝构造函数 的 主要作用 是初始化新创建的对象 , 使其内容与原对象完全相同 ;


    " 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ;

    • 使用 一个 类实例对象 初始化 另外一个 类实例对象 ;
    	// 使用一个对象初始化另外一个对象
    	// 直接手动 调用拷贝构造函数
    	Student s2 = Student(s1);
    
    • 1
    • 2
    • 3
    • 将 一个 类实例对象 赋值给 另外一个 类实例对象 ;
    	// 将一个对象赋值给另外一个对象
    	// 自动调用拷贝构造函数
    	Student s2 = s1;
    
    • 1
    • 2
    • 3
    • 类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ;
    • 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;




    二、使用一个对象初始化另外一个对象




    1、拷贝构造函数调用情况说明


    使用 一个 类实例对象 初始化 另外一个 类实例对象 会 自动调用 拷贝构造函数 ;

    	// 使用一个对象初始化另外一个对象
    	// 直接手动 调用拷贝构造函数
    	Student s2 = Student(s1);
    
    • 1
    • 2
    • 3

    在下面的代码中 , 直接 手动 调用了 Student(const Student& s) 拷贝构造函数 , 将一个已存在的 Student 类实例对象传递给了 拷贝构造函数 ;


    2、代码示例 - 使用一个对象初始化另外一个对象


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	Student(int age, int height)
    	{
    		m_age = age;
    		m_height = height;
    		cout << "调用带参数构造函数" << 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 s1(18, 170);
    
    	// 使用一个对象初始化另外一个对象
    	// 直接手动 调用拷贝构造函数
    	Student s2 = Student(s1);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	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

    执行结果 : 执行时 , 先调用了 带参构造函数 创建第一个实例对象 , 然后手动调用 拷贝构造函数 将 第一个实例对象 作为参数传递给该函数 , 这是手动调用 拷贝构造函数 ;

    调用带参数构造函数
    调用拷贝构造函数
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述





    三、将一个对象赋值给另外一个对象




    1、拷贝构造函数调用情况说明


    将 一个 类实例对象 赋值给 另外一个 类实例对象 ;

    	// 将一个对象赋值给另外一个对象
    	// 自动调用拷贝构造函数
    	Student s2 = s1;
    
    • 1
    • 2
    • 3

    下面的代码中 , 将 Student s1(18, 170) 对象 赋值给了 Student s2 对象 ;

    可以使用 构造函数 的 等号法调用 理解 , 相当于调用了 Student(const Student& s) 构造函数 ;


    使用 等号 = 进行赋值操作 , 与初始化 是 完全不同的两个概念 ;


    2、代码示例 - 将一个对象赋值给另外一个对象


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	Student(int age, int height)
    	{
    		m_age = age;
    		m_height = height;
    		cout << "调用带参数构造函数" << 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 s1(18, 170);
    
    	// 将一个对象赋值给另外一个对象
    	// 自动调用拷贝构造函数
    	Student s2 = s1;
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	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

    执行结果 : 执行时 , 先调用了 带参构造函数 创建第一个实例对象 , 然后将 第一个实例对象直接赋值给 第二个实例对象 , 期间会自动调用 拷贝构造函数 ;

    调用带参数构造函数
    调用拷贝构造函数
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题
    CAN总线负载及CANoe查看总线负载率
    RCE远程控制漏洞(下)
    Oauth2认证及Spring Security Oauth2授权码模式
    网络通信:基本原理、协议与技术趋势
    LeetCode笔记:Weekly Contest 310
    《数据结构、算法与应用C++语言描述》-栈的应用-离线等价类问题
    Flutter热更新技术探索
    Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (二)
    英语六级-day11
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132845553