【带头学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;进入到个股详情页…

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 是…

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

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

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…

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;以最大限度地提高您的效…

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;&…

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. /// &…

4.C转python

1.建立函数: def 函数名(形参): 函数体(记得写缩进) return 返回值(python中可以没有return) 2.调用函数: 函数名(实参) 实参和形参个数相等即可,类型不需要相同 其中接收返回值与C中的差不多 3.如果只是定义而不调用则函数不会执行 4.先定义函数,后调用 5.python中可以…

每天五分钟计算机视觉:ImageNet大赛的世界冠军AlexNet模型

AlexNet模型 2012 Imagenet 比赛第一&#xff0c;Top5准确度超出第二10% &#xff0c;它让人们认识到了深度学习技术的威力。比 LeNet更深&#xff0c;用多层小卷积层叠加替换大卷积层&#xff0c;就是说每一个卷积层的通道数小&#xff0c;不像LeNet一样每个卷积层的通道数很大…

记录华为云服务器(Linux 可视化 宝塔面板)-- 防火墙篇

文章目录 前言安装防火墙防火墙设置防火墙操作1.设置开机启动防火墙2.查看防火墙开放哪些端口3.重载防火墙配置&#xff08;修改配置后重新启动才生效&#xff09;4.查看防火墙状态5.开启防火墙6.关闭防火墙 若遇到无法开启查询已开放的端口查询端口是否开放&#xff08;80&…

Python爬虫-新能源汽车销量榜

前言 本文是该专栏的第11篇,后面会持续分享python爬虫案例干货,记得关注。 本文以懂车平台的新能源汽车销量榜单为例,获取各车型的销量排行榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。 废话不多说,跟着笔者直接往下看正文详细内容。(附带…

电梯安全远程监控系统的主要作用和意义

电梯是现代城市生活中必不可少的交通工具&#xff0c;为了保证其安全可靠的运行&#xff0c;电梯运行监测系统应运而生。本文将介绍电梯安全远程监控的工作原理、重要性 一、电梯安全远程监控系统的作用   ◆实时监控和故障预警&#xff1a;电梯安全远程监控系统可以实时监测…

加强网站稳定性!学习如何进行高效压力测试!

前言 1、什么是压力测试&#xff1f; 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。 软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试…

Pandas进阶:文本处理

引言 文本的主要两个类型是string和object。如果不特殊指定类型为string&#xff0c;文本类型一般为object。 文本的操作主要是通过访问器str 来实现的&#xff0c;功能十分强大&#xff0c;但使用前需要注意以下几点。 访问器只能对Series数据结构使用。 除了常规列变量df.c…

从0开始学习JavaScript--JavaScript 集成测试

JavaScript集成测试是确保整个应用程序组件协同工作的关键环节。通过模拟真实环境&#xff0c;集成测试能够发现不同组件之间的潜在问题&#xff0c;确保系统的稳定性和可靠性。本文将深入探讨JavaScript集成测试的核心概念、工具使用以及最佳实践&#xff0c;并通过丰富的示例…