构造函数

引入:构造函数的由来

对于以下Date类:

class Date
{
public:void Init(int year, int month, int day){year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//创建一个d1 并且初始化Date d1;d1.Init(2022, 7, 5);d1.Print();//创建一个d2 并且初始化Date d2;d2.Init(2022, 7, 6);d2.Print();return 0;
}

疑问:创建一个对象就得初始化一次, 未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?所以就有了构造函数!

一:构造函数的概念

构造函数 是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
并不是开空间创建对象,而是初始化对象
其特征如下:
1. 函数名与类名相同
2. 无返回值(void都不用写)
3. 对象实例化时编译器 自动调用 对应的构造函数
4. 构造函数可以重载(可以多个构造函数)

二:构造函数的分类

1:无参构造函数(全缺省,无参)->无参构造函数又叫默认构造函数
2:含参构造函数 

三:构造函数的使用

①:无参构造函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:// 1.无参构造函数Date(){_year = 1;_month = 1;_day = 1;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1; // 调用无参构造函数return 0;
}

结果:

 

②:含参构造函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1(1,1,1); // 调用无参构造函数d1.Print();return 0;
}
结果:

③:全缺省构造函数 

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:// 2.带参构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Print();Date d2(1, 1, 1); // 调用无参构造函数d2.Print();return 0;
}

结果:

①②③点的总结:

三种构造函数都可以单独使用,但是需要注意的是,无参构造函数不管是全缺省还是真的没有参数,在用的时候,都不能带括号,否则会变成函数的声明(类似 int Add( ) )

int main()
{Date d1;//正确Date d2();//错误,成了函数声明return 0;
}

④:多个构造函数

class Date {
public://无参构造函数 Date() {_year = 1;_month = 1;_day = 1;}//带参构造函数 Date(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main(void)
{Date d1;// 调用无参构造函数d1.Print();Date d2(2024, 10, 14);// 调用带参构造函数d2.Print();return 0;
}

结果:

 

④的总结:

构造函数正如其特征中的第4点,可以重载,但是默认构造函数(全缺省构造函数和无参构造函数)只能存在一个,二者语法上可以共存,但是却因为二义性不能共存

二义性代码展示:

class Date {
public:Date() {_year = 1;_month = 1;_day = 1;}Date(int year = 2024, int month = 10, int day = 14) {_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};int main(void)
{//无参,那到底是走无参,还是全缺省???Date d1;return 0;
}

结果: 

总结:

强烈推荐全缺省的构造函数,因为真的很好用!

代码如下:

#include <iostream>class Date {public:/* 全缺省 */Date(int year = 0, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}void Print() {printf("%d-%d-%d\n", _year, _month, _day);} private:int _year;int _month;int _day;
};int main(void)
{Date d1; // 不传,就是缺省值Date d2(2024, 10, 14);Date d3(2024);Date d4(2024, 10);d1.Print();  // 0-1-1d2.Print();  // 2024-10-14d3.Print();  // 2024-1-1d4.Print();  // 2024-10-1return 0;
}

四:C++编译器自动生成的无参默认构造函数

Q:如果我们不在类中,显式的写构造函数呢,系统会做什么吗?

A:会的,C++编译器会自动生成的无参默认构造函数

那C++编译器生成的构造函数,会对成员变量做什么呢?

无构造函数代码:

class Date
{public:private:int _year;int _month;int _day;
};int main(void)
{//C++编译器生成的是无参构造函数//所以也不能带(),否则成为函数声明Date d1;return 0;
}

结果:

 

发现其还是随机值?那岂不是什么都没做?

解释:

C++ 把类型分成内置类型 ( 基本类型 ) 和自定义类型。内置类型就是语言提供的数据类型,如:int/char... ,自定义类型就是我们使用 class/struct/union 等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对其内置类型的变量不作初始化,对其自定类型成员_t 调用的它的默认构造函数

①:自身类中没有显式定义构造函数,但成员变量中的自定义变量有默认构造函数(无参)

class Time
{
public:Time(){cout << "Time()" << endl;//打印了Time(),就代表这个构造函数被调用了_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

结果:

 

解释:正如前文所说, 会对其内置类型的变量不作初始化,对其自定类型成员_t调用的它的默认构造函数

②:自身类中没有显式定义构造函数,但成员变量中的自定义变量有默认构造函数(全缺省)

class Time
{
public:Time(int hour = 8, int minute = 24, int sconde = 5){cout << "Time()" << endl;//打印了Time(),就代表这个构造函数被调用了_hour = hour;_minute = minute;_second = sconde;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

结果:

 

③:自身类中没有显式定义构造函数,但成员变量中的自定义变量有含参的构造函数(非默认)

class Time
{
public:Time(int hour, int minute, int seconf){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

结果:

 

自身类中没有显式定义构造函数,且成员变量中的自定义变量也没有构造函数

 

class Time
{
public://无构造函数
private:int _hour;int _minute;int _second;
};
class Date
{private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

结果:

 

解释:都是随机值,但是可以看出,d的内置类型随机值是因为C++编译器生成的默认构造函数造成的,自定义类型_t 的成员变量也是随机值,这也是C++为Time类自动生成的默认构造函数造成的,都是随机值,但是这也是对类型的一种处理

补充:

C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即: 内置类型成员变量在 类中声明时可以给默认值
置类型成员变量在 类中声明时可以给默认值的 代码如下:
class Time
{
public:Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}private:int _hour;int _minute;int _second;
};class Date
{private:// 基本类型(内置类型)int _year = 2024;int _month = 10;int _day = 14;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

结果:

总结:

C++ 编译器生成默认的构造函数会对其内置类型的变量不作初始化,对其自定类型成员_t 调用的它的默认构造函数(不写自动生成的默认构造函数,写的无参或全缺省),根据默认构造函数来初始化,且含参的构造函数会报错。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《自然语言处理NLP》—— 词嵌入(Word Embedding)及 Word2Vec 词嵌入方法

文章目录 一、词嵌入介绍1.示例介绍2.词嵌入的主要特点3.常见的词嵌入方法3.词嵌入的应用 二、Word2Vec 词嵌入方法1. 连续词袋模型&#xff08;CBOW&#xff09;2. Skip-gram模型3.Word2Vec方法的应用 在了解词嵌入之前需要了解什么是 独热编码&#xff08;One-Hot Encoding&…

【Spring相关技术】spring进阶-自定义请求报文转对象HttpMessageConverter

文章目录 类继承体系核心类与接口说明底层调用链完整示例步骤 1: 创建自定义的HttpMessageConverter步骤 2: 配置Spring MVC使用自定义转换器步骤 3: 使用自定义转换器 相关文献 类继承体系 默认转换器即springmvc默认的转换器&#xff0c; 用的比较多的是以下两种&#xff0c;…

18063 圈中的游戏

### 思路 这个问题是经典的约瑟夫环问题。我们可以使用链表来模拟这个过程。具体步骤如下&#xff1a; 1. 创建一个循环链表&#xff0c;表示所有人。 2. 从第一个人开始&#xff0c;依次报数。 3. 每报到3的人退出圈子&#xff0c;直到只剩下一个人。 ### 伪代码 function j…

TuyaOS开发学习笔记(4)——BLE开发搭建环境、编译烧写(NRF52832)

一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装Visual Studio Code 官网下载&#xff1a;https://code.visualstudio.com 百度网盘&#xff1a;https://pan.baidu.com/s/1R62HT0PVmVzMwOXtCmIQwA 提取码&#xff1a;g9fb 1.3 安装Tuya Wind IDE 启动 Visual Studio Code 后&am…

肽合同制造(CDMO):北美和欧洲是全球最大肽合同制造(CDMO)消费地区

据 HengCe 最新调研&#xff0c;2023年中国肽合同制造&#xff08;CDMO&#xff09;市场销售收入达到了 万元&#xff0c;预计2030年可以达到 万元&#xff0c;2024-2030期间年复合增长率(CAGR)为 %。本研究项目旨在梳理肽合同制造&#xff08;CDMO&#xff09;领域产品系列&am…

前端布局与响应式设计综合指南(末)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(末) 目录 61、为什么要初始化CSS样式 62、CSS3 有哪些新特性 63、…

microsoft edge浏览器卡死问题

win11经常遇到microsoft edge浏览器卡死的情况&#xff0c;有时候是一会没用浏览器就全部卡死&#xff0c;有时候是锁屏或者电脑休眠浏览器就不能用&#xff0c;找了很多的办法都没好使&#xff0c;用以下方法好使了&#xff1a; edge浏览器中打开 edge://settings/system 把 …

【从零开始的LeetCode-算法】2135. 统计追加字母可以获得的单词数

给你两个下标从 0 开始的字符串数组 startWords 和 targetWords 。每个字符串都仅由 小写英文字母 组成。 对于 targetWords 中的每个字符串&#xff0c;检查是否能够从 startWords 中选出一个字符串&#xff0c;执行一次 转换操作 &#xff0c;得到的结果与当前 targetWords …

nemo-guardrails简单应用

环境&#xff1a;openEuler、python 3.11.6、nemoguardrails 0.10.1、Azure openAi 背景&#xff1a;工作需要&#xff0c;进行调研期间&#xff0c;发现问题太多&#xff0c;且国内网站好多没说明具体问题 时间&#xff1a;20241014 说明&#xff1a;搭建过程中主要是下载h…

apache.poi读取.xls文件时The content of an excel record cannot exceed 8224 bytes

目录 问题描述版本定位&#xff1a;打印size最大的Record定位&#xff1a;RefSubRecord解决代码 问题描述 使用apache.poi读取.xls文件时有The content of an excel record cannot exceed 8224 bytes的报错。待读取的文件的内容也是通过apache.poi写入的&#xff0c;我的文件修…

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

【拼多多】拼多多批发 | 拼多多手机端 | anti_content |

所有的anti_content都可以用官网的anti_content的生成

MySQL 的数据类型

1.整数类型 1.1 tinyint tinyint 为小整数类型&#xff0c;存储空间为1个字节&#xff08;8位&#xff09;&#xff0c;有符号范围-128 ~ 127&#xff0c;无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段&#xff0c;如某一字段 type 表示学科,其中 “type1” 表示语文…

Light灯光组件+组件的相关操作+游戏资源的加载

Light灯光组件 Type: Directional:平行光&#xff0c;模仿的是太阳光 Spot:聚光灯 Area:区域光 Color&#xff1a; 颜色值 Mode: RealTime:实时 Mix:混合 Baked:烘焙 Intersity: 光照强度 Indirect Multiplier:光照强度乘数 Shadow Type:影子设置&#xff1a;…

【python学习】1-2 配置python系统环境变量

1.点击“我的电脑”右键&#xff0c;点击属性&#xff0c;点击“高级系统设置”&#xff0c;再点击环境变量。 2.选择“系统变量”中的Path后&#xff0c;点击编辑。 3.点击新建&#xff0c;添加如图两个路径&#xff0c;即是python安装的路径位置后&#xff0c;点击确定。

C# 实现调用函数,打印日志(通过反射代理、非IOC)

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…

大数据ETL数据提取转换和加载处理

什么是 ETL&#xff1f; 提取转换加载&#xff08;英语&#xff1a;Extract, transform, load&#xff0c;简称ETL&#xff09;&#xff0c;用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。 ETL&…

某知名国企面试题

引言 金九银十&#xff0c;求职热潮再度来袭。最近&#xff0c;有位同学去一家知名国企应聘&#xff0c;回来后带回了一套面试题。这套面试题非常典型&#xff0c;其中包含了许多供应链金融方面的典型问题。这些问题很有分享的价值&#xff0c;大家也可以先自己独立思考一下&a…

PFC和LLC的本质和为什么要用PFC和LLC电路原因

我们可以用电感和电容的特性,以及电压和电流之间的不同步原理来解释PFC(功率因数校正)和LLC(谐振变换器)。 电感和电容的基本概念 电感(Inductor): 电感是一种储存电能的组件。它的电流变化比较慢,电流在电感中延迟,而电压变化得比较快。可以把电感想象成一个“滞后…

接口自动化测试介入项目管理流程

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 下图为接口自动化测试介入梧桐项目管理流程图 前景和目标&#xff1a; 现在公司的项目流程都是全部开发完成后提交到测试环境进行测试&#xff0c;导致测试人员在…