C++中的构造函数

一、类中的6个默认成员函数

如果一个类中什么都没有,那么这个类就是一个空类。但空类中并不是真的什么都没有,编译器会自动生成6个默认成员函数

分别是构造函数、析构函数、拷贝构造函数、赋值重载函数、普通对象取地址函数、const对象取地址函数

本篇博客讲解构造函数相关知识

二、构造函数的引入

对于如下Date类,实例化对象时可以通过调用成员函数Init来初始化,但如果每次创建对象时都使用该方法来初始化对象,未免有些麻烦。

因此,C++中引入了构造函数,可以在对象创建时就将其初始化。

//func.h
class Date {
private:
	int _year;
	int _month;
	int _day;

public:
	//初始化
	void Init(int year, int month, int day);

	//打印
	void Print();
};

三、构造函数特性

1.构造函数是一个特殊的成员函数,函数名与类名相同

2.当类中没有显式实现构造函数时,编译器会自动生成构造函数;当类中有显式实现构造函数时,编译器不会生成构造函数

3.构造函数在创建类类型对象时由编译器自动调用,以保证每个成员变量都能被初始化,在对象整个生命周期中只被调用一次

4.构造函数无返回值

5.构造函数可以重载

四、构造函数的显式实现

注意:当调用无参构造函数来实例化对象时,无需在对象后加 () ,因为无法与函数声明区分。

例如,实例化对象d1,Date d1即可,如果使用 Date d1(),编译器会认为这是一个函数名为d1、返回值类型为Date类的函数声明。

//func.h
class Date {
private:
	int _year;
	int _month;
	int _day;

public:
	//打印
	void Print();

	//无参构造函数
	Date();

	//有参构造函数
	Date(int year, int month, int day);
};

//func.cpp
//打印
void Date::Print()
{
	cout << _year << " " << _month << " " << _day << endl;
}

//无参构造函数
Date::Date()
{
	_year = 1;
	_month = 1;
	_day = 1;
}

//有参构造函数
Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

//test.cpp
int main()
{
	Date d1;
	d1.Print();

	Date d2(2024, 2, 2);
	d2.Print();
	return 0;
}

实际上,无参构造函数可以用全缺省构造函数替代

//func.h
//有参构造函数
Date(int year = 1, int month = 1, int day = 1);

//func.c
//有参构造函数
Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

五、默认构造函数的用处

首先明白:无参构造函数、全缺省构造函数、编译器默认生成的构造函数都是默认构造函数。(不需要传参就可以调用的构造函数都可以叫默认构造函数)

默认构造函数不会对内置数据类型进行初始化,但是对于自定义类型数据,该默认构造函数会调用自定义类型数据的构造函数来初始化。

如果已经显式定义了构造函数,该构造函数对于自定义类型数据也会调用其构造函数。

例如,在Date类中再设置一个Time类对象(自定义类型),不显式定义构造函数,那么创建Date类对象时编译器会生成默认构造函数,该默认构造函数调用Time类的构造函数,初始化自定义类型 time 。

class Time {
private:
	int _hour;
	int _minute;
	int _second;

public:
	//无参构造函数
	Time()
	{
		cout << "Time(int hour, int minute, int second)" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
};

class Date {
private:
	int _year;
	int _month;
	int _day;
	Time _time;

public:

	//打印
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
};

int main()
{
	Date d1;
	d1.Print(); 

	return 0;
}

C++11中,对于内置类型数据不初始化的缺陷,进行了优化,允许内置类型数据在类的声明中给予默认值。代码如下:

class Date {
private:
	int _year = 1;
	int _month = 1;
	int _day = 1;
	Time _time;

public:
	//打印
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/373408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全链游戏的未来趋势与Bridge Champ的创新之路

为了充分探索全链游戏的特点和趋势&#xff0c;以及Bridge Champ如何作为一个创新案例融入这一发展脉络&#xff0c;我们需要深入了解这两者之间的互动和相互影响。全链游戏&#xff0c;或完全基于区块链的游戏&#xff0c;代表了游戏行业的一个重要转型&#xff0c;它们利用区…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

华为视频监控接入到视频监控平台 (华为网路监控摄像机IPC和华为视频节点设备VCN)

目 录 一、设备介绍 1.1 华为VCN介绍 1.2 AS-V1000视频监控平台介绍 1.3 平台服务器配置说明 二、安装、配置HW_IVS软件 2.1下载安装HW_IVS软件 2.2登录HW_IVS 2.3共享到外域 三、配置华为外域参数 3.1 PCG模块设置 3.2通信协议GBT28181配置 3.3传…

Python学习路线 - Python高阶技巧 - PySpark案例实战

Python学习路线 - Python高阶技巧 - PySpark案例实战 前言介绍Spark是什么Python On SparkPySparkWhy PySpark 基础准备PySpark库的安装构建PySpark执行环境入口对象PySpark的编程模型 数据输入RDD对象Python数据容器转RDD对象读取文件转RDD对象 数据计算map方法flatMap方法red…

肿瘤免疫分型

Elements of cancer immunity and the cancer-immune set point - PubMed (nih.gov) Daniel S Chen , Ira Mellman 人类的抗癌免疫可分为三种主要表型&#xff1a;免疫沙漠表型&#xff08;棕色&#xff09;、免疫排除表型&#xff08;蓝色&#xff09;和免疫炎症型&#xff0…

查大数据检测到风险等级太高是怎么回事?

随着金融风控越来越多元化&#xff0c;大数据作为新兴的技术被运用到贷前风控中去了&#xff0c;不少人也了解过自己的大数据&#xff0c;但是由于相关知识不足&#xff0c;看不懂报告&#xff0c;在常见的问题中&#xff0c;大数据检测到风险等级太高是怎么回事呢?小易大数据…

双非本科准备秋招(17.1)—— 力扣二叉树

1、257. 二叉树的所有路径 要求返回根节点到叶子节点的所有路径&#xff0c;这里用前序遍历就好。 每次递归前&#xff0c;都让字符串s加上当前节点的值和“->”&#xff0c;然后判断是否为叶子节点&#xff0c;如果是的话&#xff0c;说明这条路径是一个答案&#xff0c;因…

unity实现第一人称和第三人称

在角色设置两个挂载点&#xff0c;第一人称时&#xff0c;相机放在eys上面&#xff0c;切换第三人称时&#xff0c;放置到3rd节点上面&#xff0c;调整节点位置&#xff0c;达到期望效果 代码 void ThirdView(){Debug.Log("切换到第三人称");camera.SetParent(third…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

IntelliJ IDE 插件开发 | (六)内部模式的使用

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

2024.1.26力扣每日一题——边权重均等查询

2024.1.26 题目来源我的题解方法一 使用dfs对每一组查询都求最近公共祖先&#xff08;会超时&#xff0c;通不过&#xff09;方法二 不需要构建图&#xff0c;直接在原始数组上进行求最大公共祖先的操作。 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2846 我的题解 …

【数据分享】1929-2023年全球站点的逐年平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)

关于旋转编码器(EC11)的使用&#xff08;判断旋转方向&#xff0c;按键处理&#xff09; 文章目录 关于旋转编码器(EC11)的使用&#xff08;判断旋转方向&#xff0c;按键处理&#xff09;零. 前言一. 注意事项二. 本文所述旋转编码器的旋转控制逻辑三. 旋转编码器判断代码&…

什么是S参数

S参数是网络参数&#xff0c;定义了反射波和入射波之间的关系&#xff0c;给定频率的S参数矩阵指定端口反射波b的矢量相对于端口入射波a的矢量&#xff0c;如下所示&#xff1a; bS∙a 在此基础上&#xff0c;如下图所示&#xff0c;为一个常见的双端口网络拓扑图&#xff1a;…

sqli.labs靶场(54-65关)

54、第五十四关 提示尝试是十次后数据库就重置&#xff0c;那我们尝试union 原来是单引号闭合 id-1 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schemadatabase()) -- 数据库&#xff1a;challenges&#xff0c…

visio对任意形状进行任意角度旋转调整

在使用VISIO进行绘图时&#xff0c;可能需要对任意的形状进行旋转&#xff0c;让其达到一致。如下图所示&#xff0c;灰色矩形与直线要保持一致&#xff0c;而实际在绘制矩形时&#xff0c;成水平朝向。需要对矩形进行调整&#xff0c;将其与直线倾斜保持一致。具体步骤如下&am…

(已解决)vueQQ邮箱注册发送验证码前端设计,如何发送验证码设计倒计时

我们之前已经通过前端测试成功完成qq邮箱动态验证码发送&#xff08;未使用redis&#xff0c;我准备自己了解完后&#xff0c;后期有时间补上&#xff09; 衔接文章&#xff1a; 1&#xff1a; spingboot 后端发送QQ邮箱验证码 2&#xff1a; 这段代码建设图形化界面 <di…

双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日 1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int datatype; enum{FALSE-1,SUCCSE}; typedef str…

RabbitMQ-2.SpringAMQP

SpringAMQP 2.SpringAMQP2.1.创建Demo工程2.2.快速入门2.1.1.消息发送2.1.2.消息接收2.1.3.测试 2.3.WorkQueues模型2.2.1.消息发送2.2.2.消息接收2.2.3.测试2.2.4.能者多劳2.2.5.总结 2.4.交换机类型2.5.Fanout交换机2.5.1.声明队列和交换机2.5.2.消息发送2.5.3.消息接收2.5.4…

文件夹正在使用无法删除(重命名)解决办法

1、问题描述 相信都遇到文件夹无法删除&#xff0c;或者无法重命名的情况。如果将文件夹正在使用的文件都已经关闭后&#xff0c;文件夹仍旧无法删除或重命名。 这个时候大概率是有隐藏的进程没有关闭&#xff0c;可以重启电脑&#xff0c;或者采用下面的方式关闭对应文件夹的…