当前位置: 首页 > news >正文

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

文章目录

  • 一、构造函数意义
    • 1、类的构造函数
    • 2、构造函数显式调用与隐式调用
    • 3、构造函数替代方案 - 初始化函数
    • 4、初始化函数缺陷
    • 5、默认构造函数
    • 6、代码示例 - 初始化函数无法及时调用





一、构造函数意义




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;}

在使用 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;
}

执行结果 :

在这里插入图片描述

http://www.lryc.cn/news/164849.html

相关文章:

  • VMware16安装ghost版win7
  • 项目集成swagger,访问不到swagger页面
  • 微信小程序怎么隐藏顶部导航栏(navigationBar)变透明的解决方案
  • RabbitMQ基础概念-02
  • 从构建者到设计者的低代码之路
  • Linux创建进程 及父子进程虚拟空间 多进程GDB调试
  • uni-app 之 表格设置
  • Linux易混淆知识点
  • 移植FlashDB、SFUD到STM32f407
  • 【算法基础】时间复杂度和空间复杂度
  • 解决微信小程序不支持TextEncoder/TextDecoder对象
  • Qt下SVG格式图片应用
  • python异常处理
  • go get命令不再具有安装功能
  • 合宙Air724UG LuatOS-Air lvgl7-lvgl(矢量字体)
  • LRU的实现
  • consul 备份还原导入导出
  • 6.网络编程套接字(下)
  • 4.3-内置后置PostProcess处理器深度讲解
  • LeetCode(力扣)45. 跳跃游戏 IIPython
  • mysql5.8 免安装版(压缩包)win10 安装
  • STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器
  • python-wordcloud词云
  • 单元测试与自测
  • 2023-09-12 LeetCode每日一题(课程表 IV)
  • RabbitMQ基础
  • ITIL 4—创建、交付和支持—创建、交付和支持服务的价值流
  • 微信怎么给自己发消息
  • 正交试验设计法
  • Scrum工具:助力快速迭代和高效交付