详解构造函数

前言

希望这篇文章是有意义的,能够帮助初学者理清构造函数的概念,关系及误区。首先定义一个日期类,借助日期类讲解构造函数。

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

构造函数的概念

构造函数的功能是初始化数据,功能和Init函数一样。默认构造函数会被系统自动调用。

定义构造函数

函数名和类名相同,无返回值。下面以日期类为例,一一展示不同的构造函数。

无参构造函数

Date()  //类名和函数名相同
{_year = 1;_month = 1;_day = 1;
}

全缺省构造

Date(int year = 0, int month = 0, int day = 0) //函数名和类名相同,无返回值
{_year = year;_month = month;_day = day;
}

带参数列表的构造函数

Date(int year, int month, int day)函数名和类名相同,无返回值
{_year = year; _month = month;         _day = day;  
}

系统自动生成的构造函数

无需自己定义,系统会自动生成。

这四种构造函数的关系

如图:

默认构造函数用通俗的话来讲就是不需要传参的函数,系统自动调用的是默认构造函数。带参数列表需要系统给定参数才能调用。如下代码:

Date d(1, 2, 3);  //以日期类实例化对象d,参数给定1,2,3

调用构造函数时各函数之间的关系

构造函数的特性

                                             构造函数的特性

1.函数名与类名相同

2.在实例化对象时自动调用
3.无返回值
4.可以重载
5.编译器自动生成的构造函数对内置类型不做处理,对自定义类型编译器会调用它的默认构造函数

第4点很好理解,只要符合重载要求,就可以定义多个构造函数。重点讲一下第5点。

构造函数对不同类型的处理

内置类型就是语言提供的数据类型,如:int/char,自定义类型就是我们使用class/struct等关键字把内置类型封装起来的类型

嵌套实例化多个类,但每个类都不定义初始化方法,也不定义构造函数。会发生什么呢?

代码:

class Date3
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;};
class Date2
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;Date3 d3;
};
class Date1
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;Date2 d2;
};
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;Date1 d1;
};class Test
{Date d;
};int main()
{Test t;
}

逻辑示意图:

结果:所有的内置类型都不会被初始化

原因很简单,因为每个类都不定义初始化方法,也不定义构造函数,系统会调用自动生成的构造函数,而这个函数对内置类型不做处理,对自定义类型会调用自定义类型的默认构造函数,因为并没有定义默认构造函数中的无参构造和全缺省构造,系统又会调用自动生成的构造函数来处理自定义类型,因为自定义类型是由内置类型构成的,所以全是随机数。

逻辑示意图:

由此可以推出,只要所有内层的类都定义了默认构造函数,最外面一层就可以不写任何的初始化方法或构造函数即可完成初始化。

定义构造函数时的注意点

1,无参构造函数和全缺省构造函数同时定义可能会发生调用歧义。

2.带参数列表的构造函数和全缺省构造函数同时定义可能会发生调用歧义。

可怜可怜孩子给个三连吧,给个赞也行啊(委屈)

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

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

相关文章

CDP7 下载安装 Flink Percel 包

下载链接&#xff1a;https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本&#xff0c; 然后点击download now&#xff0c;会有一个协议&#xff0c;勾选即可&#xff0c;然后就有三个文件列表&#xff0c; 我这里是已经注册登录的状态&#xff0c;如果没…

64B/66B GT Transceiver 配置

一、前言 前一篇文章已经讲述了64B/66B的编码原理&#xff0c;此篇文章来配置一下7系列GT的64B/66B编码。并讲述所对应的例子工程的架构&#xff0c;以及部分代码的含义。 二、IP核配置 1、打开7 Series FPGAs Transceiver Wizards&#xff0c;选择将共享逻辑放置在example …

【面试题】s += 1 和 s = s + 1的区别

文章目录 1.问题2.发现过程3.解析 1.问题 以下两个程序真的完全等同吗&#xff1f; short s 0; s 1; short s 0; s s 1; 2.发现过程 初看s 1 和 s s 1好像是等价的&#xff0c;没有什么区别。很长一段时间内我也是这么觉得&#xff0c;因为当时学习c语言的时候教科书…

【数据挖掘】实验6:初级绘图

实验6&#xff1a;初级绘图 一&#xff1a;实验目的与要求 1&#xff1a;了解R语言中各种图形元素的添加方法&#xff0c;并能够灵活应用这些元素。 2&#xff1a;了解R语言中的各种图形函数&#xff0c;掌握常见图形的绘制方法。 二&#xff1a;实验内容 【直方图】 Eg.1&…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…

pyqt和opencv结合01:读取图像、显示

在这里插入图片描述 1 、opencv读取图像用于pyqt显示 # image cv2.imread(file_path)image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像转换为 Qt 可接受的格式height, width, channel image.shapebytes_per_line 3 * widthq_image QImage(image.data, width, hei…

vue3 uniapp微信登录

根据最新的微信小程序官方的规定&#xff0c;uniapp中的uni.getUserInfo方法不再返回用户头像和昵称、以及手机号 首先&#xff0c;需获取appID&#xff0c;appSecret&#xff0c;如下图 先调用uni.getUserInfo方法获取code&#xff0c;然后调用后台的api&#xff0c;传入code&…

ssm049基于Vue.js的在线购物系统的设计与实现+vue

在线购物系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线购物系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线购物系统&#xff0c;它彻底改…

【氮化镓】GaN HEMTs结温和热阻测试方法

文章《Temperature rise detection in GaN high-electron-mobility transistors via gate-drain Schottky junction forward-conduction voltages》&#xff0c;由Xiujuan Huang, Chunsheng Guo, Qian Wen, Shiwei Feng, 和 Yamin Zhang撰写&#xff0c;发表在《Microelectroni…

Linux调试器之gdb

前言 我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢&#xff1f;我们并未介绍&#xff0c;本期我们将来介绍最后一个工具 --- 调试器gdb。 本期内…

Tomcat服务器入门介及用postman工具简单接收数据 2024详解

Tomcat服务器 简介 Tomcat是一个开源的Servlet容器&#xff0c;也是一个支持Java Servlet和JSP技术的Web服务器。它由Apache软件基金会开发和维护。Tomcat的主要作用是将Java Servlet和JavaServer Pages&#xff08;JSP&#xff09;等动态网页技术部署到服务器上&#xff0c;…

基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024最新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了…

13.多通道视频流缓存以及显示架构

1 简介 多通道视频流缓存以及显示架构是一个在数字图像处理中很基础也很重要的一个架构。在图像拼接以及高分辨率图像显示方面应用范围较为广泛。本文将介绍一个四通道的图像显示。可以四个图像信息输入以及拼接到一个显示屏里面。使用的开发板为A7 2 框架图 架构图如下图所示…

4/11 QT_day5

服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QMessageBox> #include <QTcpSocket> #include <QList> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

专题十三、预处理器

预处理器 1. 预处理器的工作原理2. 预处理指令3. 宏定义3.1 简单的宏3.2 带参数的宏3.3 # 运算符3.4 ## 运算符3.5 宏的通用属性3.6 宏定义中的圆括号3.7 创建较长的宏3.8 预定义宏3.9 C99 中新增的预定义宏3.10 空的宏参数3.11 参数个数可变的宏3.12 __func__ 标识符 4. 条件编…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

IoC与Spring

目录 IoC控制反转 现实案例 特点 目的 DI依赖注入 小总结 介绍Spring 狭义和广义上的Spring 传统编码方式的不足 需求引入 弊端分析 IoC控制反转 现实案例 1、买水果问老板各种水果的口感而不是自己去挨个尝试一遍。 2、买房子找中介而不是自己去花时间找房东。…

.cur 鼠标光标编辑器

详解透明贴图和三元光栅操作 - CodeBus 鼠标指针文件格式解析——Windows&#xff08;二&#xff09; (qq.com) [C/C] RGBA数组生成Windows下的ico文件_c ico格式-CSDN博客 色环设计 - CodeBus 左键绘制 右键选颜色 ctrl右键设置鼠标热点 F1导出.cur文件 //代码来源&…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树 738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈…