【带头学C++】----- 九、类和对象 ---- 9.2 构造函数

目录

9.2 构造函数

9.2.1 构造函数的概述

9.2.2 构造函数定义方法(初始化构造函数)

9.2.3 提供构造函数的影响


9.2 构造函数

以下是一些C++引入构造函数的原因:

  1. 初始化对象:构造函数允许在创建对象时立即初始化该对象的成员变量。通过在构造函数中指定初始值,可以确保对象在使用之前具有合适的初始状态,避免了未初始化的对象和潜在的错误。未初始化的对象和成员,在使用中很容易造成未知的错误,所以尽量要避免使用未初始化的对象。

  2. 参数化对象初始化:构造函数可以接受参数,并使用这些参数来设置对象的状态。这样,通过在创建对象时传递不同的参数,可以方便地初始化不同的对象实例。

  3. 自定义对象的实例化方式:通过定义不同类型的构造函数,可以实现不同的对象实例化方式。例如,可以指定不同的构造函数来处理不同的参数组合,从而实现重载的构造函数。

  4. 类型转换和隐式构造:C++允许使用单参数的构造函数作为隐式转换的一部分。这使得可以通过将一个特定参数的类型隐式地转换为对象类型来创建和初始化对象。

简单理解一件事:初始化是在程序第一次运行时给变量和函数设定初始值的过程。比如,如果我们希望一个用来计数的整数变量初始值为0,就需要在程序启动时对这个变量进行初始化,即设置初始值为0。引入类和对象后,构造函数就成为了初始化对象的特殊函数。当我们创建对象时,构造函数会运行,负责对对象的成员变量进行赋值和执行其他操作。我们可以在构造函数中初始化和赋值普通成员变量和函数,确保对象在创建时有适当的状态和行为。通过构造函数的使用,我们能够灵活地初始化对象,满足不同需求。

9.2.1 构造函数的概述

       类在实例化对象的时候,系统自动调用构造函数完成对象的初始化。如果用户不提供构造函数编译器会自动添加一个默认的构造函数(空函数)。

        C++为了给我们提供这种问题的解决方案,构造函数析构函数,这两个函教将会被编译器自动调用,完成对象初始化和对象清理工作。无论你是否需要,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,

9.2.2 构造函数定义方法(初始化构造函数)

      构造函数名和类名相同,没有返回值类型(连void都不可以),可以有参数(可以重载)先给对象开辟空间(实例化) 然后调用构造函数(初始化)。在public权限下进行构造函数的定义。

 

 代码:

#include <iostream>using namespace std;class Data{
public:int mA;
public://无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}};void test01(){//隐式调用无参构造函数(推荐写法)Data da1;//显示调用无参构造函数Data da2 = Data();//隐式调用有参构造函数(推荐写法)Data da3(10);//显示调用有参构造函数Data da4 = Data(11);//匿名对象(无参) 当前语句结束后立即自动释放该对象Data();Data(20);//构造函数隐式转换Data da5 = 111;//适用于类中只有一个数据成员}int main()
{test01();return 0;
}

9.2.3 提供构造函数的影响

如果用户不提供任何构造函数 编译器默认提供一个空的无参构造如果用户定义了构造函数(不管是有参、无参),编译器不再提供默认构造函数

第一种情况,对象没有构造函数时怎么办?(此时系统会提供默认的构造和析构函数)

 案例代码:

class Data{
public:int mA;
public:
#if 0//无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}
#endif#if 0//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}
#endif
};void test02(){Data da1;cout << da1.mA <<endl;
}

第二种情况,提供一个有参构造函数。定义对象时使用无参构造对象。此时不管如何,系统都不会给你定义新的无参或者有参构造函数。

 代码:(此源码报错,注意甄别)

class Data{
public:int mA;
public:
#if 0//无参构造函数Data(){mA = 0;cout << "无参构造函数" << endl;}
#endif#if 1//有参构造函数Data(int a){mA = a;cout << "有参构造函数 ,mA = " << mA << endl;}
#endif
};void test02(){Data da1;cout << da1.mA <<endl;
}

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

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

相关文章

如何快速了解一家公司?

在炒股过程中&#xff0c;我们想要了解一家公司是否具有投资价值&#xff0c;需要查看和阅读很多公司的相关资料。股民们自行去查询往往会花费很多的时间精力&#xff0c;所以专业的炒股软件一般都会给股民提供这些现成的资料。 在金斗云智投APP内&#xff0c;进入到个股详情页…

【Node.js】笔记梳理 7 - mongoose

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

mac修改默认shell为bash

1. 打开系统偏好设置 2. 点击用户群组 3. 按住ctrl&#xff0c;点击用户名 4. 点击高级选项&#xff0c;修改登录shell 参考&#xff1a;在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国)

Node-red

Node-Red 什么是Node-redNode-red的特点 Node-red的Windows安装安装Node.js安装包下载安装包安装安装检查 安装Node-red安装Note-red运行Note-red 什么是Node-red Node-RED 是一种编程工具&#xff0c;用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。 Node-RED 是…

elementui el-table用span-method方法对相同的列名或行名进行合并

看到的一篇文章 同理 如果对第二列进行合并的话copy一下第一个方法&#xff0c;让值赋给第二个数组就可以 // 合并方法mergeCells({ row, column , rowIndex, columnIndex }) {debugger;if (columnIndex 1) {const _row this.spanArr[rowIndex];const _col _row > 0 ? …

抽奖送平板是骗局!!!

在街上被派传单&#xff0c;然后扫了码抽奖中了平板&#xff0c;被领到卖电器门店兑奖。他们给我在宜嘉商城上充值4980&#xff0c;我现场给他们付了4980元&#xff0c;签了他们的业务办理单&#xff0c;上面有违约者赔款30%违约金字样。我领走了荣耀畅玩40plus手机一台。第二天…

手敲单链表,简单了解其运行逻辑

1. 链表 1.1 结构组成 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构如下图所示&#xff0c;是由很多个节点相互通过引用来连接而成的&#xff1b;每一个节点由两部分组成&#xff0c;分别数据域&…

CSS 垂直水平居中总结(全)

目录 1&#xff0c;不需要知道元素的宽高1.1&#xff0c;flex&#xff08;2种&#xff09;1.2&#xff0c;grid&#xff08;2种&#xff09;1.3&#xff0c;verticle-align:middle1.4&#xff0c;绝对定位1.5&#xff0c;table-cell 2&#xff0c;需要知道元素的宽高2.1&#x…

MySQL 索引,优化,回表,执行计划等相关总结学习

一、MySQL 执行流程 innoDB表引擎&#xff1a;默认的事务型引擎&#xff0c;最重要最广泛的存储引擎&#xff0c;性能非常优秀,数据村粗在共享表空间&#xff0c;可以通过配置分开,主键查询性能高于其他引擎 myISM表引擎&#xff1a;5.1版本前这个是默认的存储引擎&#xff0c…

第九节HarmonyOS 常用基础组件-Text

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

segment-anything安装教程

文章目录 一. segment-anything安装教程 一. segment-anything安装教程 官网安装说明:https://github.com/facebookresearch/segment-anything anaconda下新建一个环境 conda create -n sam python3.8激活新建的环境 conda activate sam更换conda镜像源 conda config --add ch…

基于Spring,SpringMVC,MyBatis的高校大学社团系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的高校大…

大厂面试整理

文章目录 1、[京东一面](https://blog.csdn.net/crazymakercircle/article/details/132150378)2、[阿里一面](https://blog.csdn.net/crazymakercircle/article/details/131147192)3、[顺丰一面](https://blog.csdn.net/crazymakercircle/article/details/132000420)4、[美团一…

Python过滤掉特定区域内的矩形框

Python过滤掉特定区域内的矩形框 前言前提条件相关介绍实验环境过滤掉特定区域内的矩形框方法一&#xff1a;直接法&#xff08;for循环遍历&#xff09;代码实现输出结果 方法二&#xff1a;列表推导式代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

Navicat Premium 16.3.3 Windows x64 Crack

增强您的表现。 Navicat 16 具有许多改进和功能&#xff0c;可以满足您的数据库开发需求。凭借 100 多项增强功能和全新界面&#xff0c;您可以探索构建、管理和维护数据库的新方法。构建时考虑到可用性。 Navicat 16 引入了许多 UI/UX 改进&#xff0c;以最大限度地提高您的效…

oracle 19c rac 安装手册

oracle 19c rac 安装手册 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/index.html 一、集群规划 再部署集群之前,需要对网络和存储两个方面进行规划。下面简述了网络和存储两个方面需要注意的地方。 Oracle RAC 数据库私有网络通信必须使用单…

P4 链表的节点数统计与链表数据查找替换

目录 前言 01 链表的节点数统计 02 链表数据查找替换 2.1 残疾的数据查找 2.2 数据查找优化 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C 》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;》✨…

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap 吧&#xff01;&…

Yocto - bb脚本中使用的SRC_URI、SRCREV和S

我们遇到的各种自己不了解的技术或产品时&#xff0c;都需要阅读用户手册。用户手册里的内容很多时&#xff0c;除了由目录组织文档结构外&#xff0c;通常还有有一个词汇表&#xff0c;一般作为附录放在文档最后。 通过这个按照字母排序的词汇表&#xff0c;可以在对整个文档还…

C#,数值计算——插值和外推,谢别德(Shep)插值方法的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 谢别德插值方法 /// Object for Shepard interpolation using n points in dim dimensions. Call /// constructor once, then interp as many times as desired. /// &…