• 【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )






    一、构造函数意义




    1、类的构造函数


    C++ 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化 和 销毁 方案 ;

    定义一个类的 若干 实例对象 , 每个对象都有独立的 成员属性 ;

    当 定义 类的 实例对象时 , C++ 编译器 会自动调用 开发者定义的 构造函数 ;


    2、构造函数显式调用与隐式调用


    类 的 构造函数 可以 自动调用 , 也可以手动调用 ;

    • 一般 默认的 无参构造函数 是 自动地 隐式调用 ;
    • 有参构造函数 是 由开发者 手动显式调用 ;

    3、构造函数替代方案 - 初始化函数


    构造函数的替代方案 - 初始化函数 :

    • 共有初始化函数 : 为每个类定义一个 public 共有初始化函数 ;
    • 调用时机 : 创建对象后需要马上进行初始化操作 ;

    4、初始化函数缺陷


    初始化函数 与 构造函数 对比 的缺陷 :

    • 操作繁琐 : 初始化函数 只是一个普通的 共有函数 , 必须 由开发者 手动调用 , 并且是 显式调用 , 操作起来比较繁琐 ;
    • 操作遗漏 : 使用 初始化函数 对 实例对象 进行初始化操作 , 不能有遗漏 , 如果 实例对象 没有进行初始化 , 其中的成员变量值 是随机值 , 不确定 , 造成未知风险 ;
    • 无法调用 : 在某些特殊场合 , 初始化函数是无法被调用到的 , 如 : 只定义类的变量类型 , 没有调用构造函数 , 此时会自动调用无参构造函数初始化实例对象 , 如果使用初始化函数 , 则无法进行初始化操作 ;

    5、默认构造函数


    如果 定义 类 时 , 没有写 构造函数 , C++ 编译器 会 为类 提供一个默认构造函数 ;

    默认构造函数 的 函数体为空 , 不需要开发者定义 , 由 C++ 编译器默认提供 ;


    默认构造函数 分为 2 种类型 :

    • 默认无参构造函数 : 如果 类 中没有定义 构造函数 , C++ 编译器 会默认提供一个 无参构造函数 , 该构造函数的函数体为空 ;
    • 默认拷贝构造函数 : 如果 类 中没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ;

    6、代码示例 - 初始化函数无法及时调用


    下面的代码中 在 Student 类中 , 定义了初始化 函数 :

    	// 初始化函数 初始化 实例对象
    	void init(int _age, int _height)
    	{
    		m_age = _age;
    		m_height = _height;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在使用 Student s 代码定义实例对象的场景下 , 无法及时地调用 初始化函数 ;


    代码示例 - 初始化函数 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	// 初始化函数 初始化 实例对象
    	void init(int _age, int _height)
    	{
    		m_age = _age;
    		m_height = _height;
    	}
    
    public:
    	int m_age;		// 年龄
    	int m_height;	// 身高
    };
    
    int main()
    {
    	// 定义 Student 类实例对象
    	// Student 类 没有提供构造函数 , C++ 编译器 会提供一个 默认构造函数
    	// Student 类 没有提供拷贝构造函数 , C++ 编译器 会提供一个 默认拷贝构造函数
    	Student s;
    	// 调用初始化函数
    	s.init(18, 170);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	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

    执行结果 :

    在这里插入图片描述

  • 相关阅读:
    Ant Design Vue的上传图片组件Upload封装和遇到的问题
    由于使用校园网,ubuntu虚拟机时而不能连接网络的解决方案
    【数据结构初阶】栈和队列(C语言实现+图解)
    状态管理的艺术:探索Flutter的Provider库
    Linux:今天学vim编辑器,gdb调试器,makefile项目自动化构建工具
    iOS UIDevice设备信息
    密码学系列之六:公钥密码体制
    Git 常用命令汇总
    穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益(2023.11)
    数字孪生技术的应用在能源行业案例解析
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132823429