【C++】类和对象(三):构造函数

大家好,我是苏貝,本篇博客带大家了解C++的构造函数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


1. 概念

在这里插入图片描述
在这里插入图片描述

对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。

2. 特性

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

其特征如下:

  1. 函数名与类名相同。
  2. 无返回值。 (不是说返回值是void,而是不写返回值)
  3. 对象实例化时编译器一定会自动调用对应的构造函数。
  4. 构造函数可以重载

注意:构造函数记得权限设为public

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里编译器为d1调用了无参的构造函数,无参的构造函数并没有对年月日进行初始化,因此打印出的年月日是随机值(有一些编译器会将它们初始化为0,这只是它们自己的行为,C++标准没有规定要初始化)。那好像无参的构造函数并没有做什么啊?不是的,在第6点会说

注意:
如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明(函数名为d3,返回值的类型是Date)
在这里插入图片描述

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

默认构造函数是什么意思?

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。为什么?因为如果2个同时存在,现在定义一个对象d1,无参的和全缺省的构造函数都符合要求,编译器不知道要调用哪一个
在这里插入图片描述

注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。也就是说,对象不需要传参就能调用的构造函数,就是默认构造函数。一般情况下,建议提供全缺省的构造函数

下图的Date类中我们自己没有定义构造函数,编译器自动给我们默认生成了一个无参的构造函数
在这里插入图片描述

如果我们在Date类中定义一个有参的构造函数,那么编译器将不会生成,那就会报错。报错原因:对象实例化时编译器一定会自动调用构造函数,现在定义对象d1,由于Date类中存在有参的构造函数,那么编译器将不会生成无参的,d1需要无参的或者全缺省的,没有就报错

在这里插入图片描述
在这里插入图片描述

上面第4点中,d1对象调用了编译器生成的无参的构造函数,但是d1对象的_year/_month/_day,依旧是随机值(有一些编译器会将它们初始化为0,这只是它们自己的行为,C++标准没有规定要初始化)。也就说在这里编译器生成的无参构造函数并没有什么用??

解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型,如:int/char/double/指针等,自定义类型就是我们使用class/struct/union等自己定义的类型。C++98里,编译器生成默认的构造函数,对成员变量里,是内置类型的不做处理,是自定义类型的会去调用它的默认构造函数

看下图,Date类没写构造函数,编译器会默认生成一个无参的构造函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

看结果,调用了A类的默认构造参数,对内置类型不做处理

可是编译器生成默认的构造函数,对内置类型不做处理也不太好,于是C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即可以在类里的成员变量声明时给缺省值,这样编译器生成默认的构造函数,对成员变量里,是内置类型的就用缺省值,是自定义类型的会去调用它的默认构造函数

在这里插入图片描述

在这里插入图片描述

因此以后我们写类的构造函数时,分析成员变量初始化和其它需求,需要我们写构造函数时就写,不需要时就用编译器自动生成的。其实,绝大部分情况下都需要我们自己写构造函数


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值