类与对象(中篇)

        1、类的6个默认成员函数

        如果一个类中什么成员都没有,简称为空类。

        空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

        默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

         2、构造函数---初始化

        2、1概念

        对于以下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()
{Date d1;d1.Init(2022, 7, 5);d1.Print();Date d2;d2.Init(2022, 7, 6);d2.Print();return 0;
}

        对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦/或者说容易忘记初始化,那能否在对象创建时,就将信息设置进去呢?

        构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,类似于Init,并且在对象整个生命周期内只调用一次。

        2、2特性

        构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

        2、2、1. 函数名与类名相同

        2、2、2. 无返回值。(不是void,就是不需要写)

        2、2、3. 对象实例化时编译器自动调用对应的构造函数。如果没有对应的构造函数,会报错。即必须得有构造函数

        2、2、4. 构造函数可以重载

        2、2、5、可以无参,也可以带参。如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。

class Date
{
public:// 1.无参构造函数Date(){_year = 2024;_month = 2;_day = 24;}// 2.带参构造函数,同时也构成重载Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};void TestDate()
{Date d1; // 调用无参构造函数Date d2(2015, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象// warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)Date d3();
}

        上面这个构造函数不太好看,我们可以使用全缺省,来达到比较正规的构造函数。

class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};void TestDate()
{Date d1;Date d2(2015, 3, 4); 
}

        注意,一般不将全缺省和无参的构造函数一起出现,否则调用的时候都是Date d1;会构成歧义,不知道在调用什么。

         2、2、6注意:如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义构造函数编译器将不再生成

class Date
{
public:/*// 如果用户显式定义了构造函数,编译器将不再生成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类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数// 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成// 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用Date d1;return 0;
}

        其实,如果我们没有写构造函数,实例化对象的时候,是没有初始化成员变量的!

        虽然是有默认构造函数的,但是祖师爷可能当时喝了点小酒,并没有初始化。

        这里需要讲到一点东西:

        内置类型/基本类型 : int char double 指针等等

        自定义类型:struct  class  union ....

        2、2、7C++规定,默认生成的构造函数,内置类型不做处理,只对自定义类型作处理,自定义类型去调用它自己的构造函数

class A
{
public:A(){cout << "A()" << endl;}
private:int _a;
};
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year ;int _month ;int _day ;A _aa;
};
int main()
{Date d1;return 0;
}

        这里会调用A的构造函数,输出"A()" 

       2、2、8 C++11委员会对这种情况打了个补丁,在声明的位置给缺省值

private://这里也是声明,并不是定义,只是给了缺省值int _year = 1;int _month = 1;int _day = 1;
};

        如果不写构造函数,那么内置类型的成员变量就是缺省值。如果给了构造函数,还是调用构造函数。 

        所以,一般我们都自己写构造函数,不要依赖编译器,绝大多数场景下面都需要自己实现构造函数

        2、2、9真正的默认构造函数

        .无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数全缺省构造函数、我们没写

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

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

相关文章

操作筛选器的 1 个应用实例:自动启用事务

前言 在数据库操作过程中&#xff0c;有一个概念是绕不开的&#xff0c;那就是事务。 事务能够确保一系列数据库操作要么全部成功提交&#xff0c;要么全部失败回滚&#xff0c;保证数据的一致性和完整性。 在 Asp.Net Core Web API 中&#xff0c;我们可以使用操作筛选器给…

elasticsearch8.x版本docker部署说明和集成springboot

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…

数字图像处理(实践篇)三十八 OpenCV-Python实现ORB特征检测实践

​ 目录 一 涉及的函数 二 实践 ​ ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。

呼吸灯--FPGA

目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮&#xff0c;再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是&#xff0c;首先灯是在第一个时钟周期保持高电平熄灭状态&#xff0c;在第二个时钟周期保持1/1…

Log4j2-11-log4j2 Layout 布局入门介绍

Layout 布局 Appender使用Layout将LogEvent格式化为一种表单&#xff0c;以满足将要消费日志事件的任何需求。 在Log4j中。x和Logback布局被期望将事件转换为字符串。 在Log4j 2布局返回一个字节数组。这使得Layout的结果可以在更多类型的appender中使用。然而&#xff0c;这…

[网络安全]IIS---FTP服务器 、serverU详解

一 . FTP服务器(File Transfor Protocol) : 协议:文件传输协议 端口号:TCP: 20(数据) / 21(控制) 二 . FTP工作方式: 1.主动模式 : (FTP服务器21端口与FTP客户端产生的随机端口先建立连接 建立连接后,再使用FTP服务器21端口与FTP客户端创建的一个新的随机端口进行发送…

day13_oop_抽象类_接口

今日内容 零、 复习昨日 一、作业 二、抽象 三、接口 零、 复习昨日 final的作用 最终的,修饰的类,属性,方法不能改变类不能继承,属性不能改变(常量),方法不能重写 static修饰方法的特点 修饰的属性方法在内存只有一份随着类加载而初始化不要new,可以通过类名直接调用被该类的所…

设备远程监控系统:实现设备智能化管理的关键

在工业4.0和智能制造的浪潮下&#xff0c;设备远程监控系统成为了实现设备智能化管理的关键。HiWoo Cloud作为工业物联网平台&#xff0c;致力于为企业提供稳定、高效的设备远程监控解决方案&#xff0c;助力企业实现数字化转型。 一、设备远程监控系统的概述 设备远程监控系统…

字符串中的单词反转【leetcode】

本题选自leetcode图解算法数据结构一书 你在与一位习惯从右往左阅读的朋友发消息&#xff0c;他发出的文字顺序都与正常相反但单词内容正确&#xff0c;为了和他顺利交流你决定写一个转换程序&#xff0c;把他所发的消息 message 转换为正常语序。 注意&#xff1a;输入字符串…

可有效应对人手不足的线缆测径仪!

关键词&#xff1a;测径仪,线缆测径仪,电缆测径仪,在线测径仪,高线测径仪 线缆电缆&#xff0c;一般成卷出售&#xff0c;每卷线缆的品质都要有保障&#xff0c;加上其大长度连续叠加组合生产方式&#xff0c;对电线电缆生产的影响是全局性和控制性的&#xff0c;因此任意位置的…

java生成dll,并利用c语言使用libcurl调用http接口

本文可能需要使用的环境和工具&#xff1a; c/ c和GCC编译器 (Windows) Cygwin或MinGW 本文运行环境为windows10&#xff0c;使用MinGW-W64-builds-4.2.0 curl-8.5.0 libcurl 可以在官网 http://curl.haxx.se/ 获得。 配置MinGW 将mingw.rar解压到D:&#xff0c;修改系统…

操作系统基础:进程同步【中】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 进程同步&#xff08;中&#xff09;1.1 信号量机制1.1.1 总览1.1.2 什么是信号量机制1.1.2.1 什么是信号量1.1.2.2 什么是原语1.1.2.3 "一对原语" 指的是什么…