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

news/2024/5/19 1:30:10 标签: c++, 构造函数

文章目录





一、构造函数意义




1、类的构造函数


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

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

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


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


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

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

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


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

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

4、初始化函数缺陷


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

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

5、默认构造函数


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

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


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


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.niftyadmin.cn/n/5022190.html

相关文章

Mac node nvm 切换版本,指定版本

一、Homebrew自动安装 // Homebrew安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" // Homebrew卸载 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)&quo…

大数据Flink(七十八):SQL 的水印操作(Watermark)

文章目录 SQL 的水印操作(Watermark) 一、为什么要有 WaterMark

vue实现鼠标移入图片播放视频

// 我已经写成组件&#xff0c;直接复制粘贴引用即可 // imgOrVideo.vue <template><div class"video-container"><divclass"video-wrapper"ref"videoWrapper"mouseenter"handleMouseEnter"mouseout"handleEnde…

Python基于Flask的高校舆情分析,舆情监控可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 运行效果图 基于Python的微博大数据舆情分析&#xff0c;舆论情感分析可视化系统 系统介绍 微博舆情分析系…

SQL_牛客网_SQL264_求每个登陆日期的次日留存率

牛客每个人最近的登录日期(五) 牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login)记录表&#xff0c;简况如下: id user_id client_id date 1 2 1 2020-10-12 2 3 2 2020-10-12 3 1 2 2020-10-…

思岚雷达A2M12版本

报错&#xff1a;Ordered comparison between pointer and zero (‘char *’ and ‘int’) error 思岚官网下载&#xff1a;https://www.slamtec.com/cn/Support#rplidar-a-series 进入网页下载SDK&#xff1a;https://github.com/slamtec/rplidar_sdk cd rplidar_sdk make…

【uniapp】使用canvas组件编译到微信小程序兼容出错问题

使用uniapp编译跨平台项目会遇到不少兼容问题&#xff0c;这里主要讲canvas组件的&#xff0c;编译到微信小程序会有兼容出错问题&#xff0c;这里给讲一下解决方案&#xff0c;希望有帮助。 常见问题 draw无法绘制图形 如果使用CanvasContext绘制&#xff0c;以下代码&…

Linux内核分析与应用9-设备驱动

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 9.1 设备驱动概述 因为UNIX/Linux一切皆文件,所以也将设备纳入文件管理体系下 Linux将设备分为三大类,一类是像磁盘那样,以块或扇…