【C++语法】类和对象(2)
4.类和对象(2)
文章目录
- 4.类和对象(2)
- 类的六个默认成员函数
- (1)构造函数:
- 构造函数特点
- 含有缺省参数的构造函数
- 构造函数特点(续)
- 注意事项
- 构造函数补充
前面总结了有关对象概念,对比 C 与 C++ 编程范式;讲解类定义、访问限定、作用域、实例化;说明类存储大小含内存对齐,即便无成员变量也占 1 字节;还阐述 this 指针特性,它是成员函数隐式形参。忘记了就回去看
类和对象(1)
类的六个默认成员函数
空类并不是什么都没有,在用户没有显式实现的情况下,编译器会默认生成六个成员函数。
(1)构造函数:
构造函数的函数名与类名相同,在实例化类类型对象时自动调用,并且在对象的生命周期内只调用一次,构造函数的主要作用是初始化对象,而不是创建对象
构造函数特点
1.构造函数的函数名与类名相同
2.没有返回值,不写void
3.构造函数在对象实例化后自动调用
4.支持函数重载(函数重载的规则与之前学的内容一致)可以使用缺省参数
特别要注意:构造函数虽然是在对象实例化时编译器自动调用该函数。但不可以把构造函数放在private或protect中
含有缺省参数的构造函数
在这种情况下我们可以在对象实例化时进行传参,注意:这里是传参,并不是将对象进行初始化,要与结构体初始化区分开来,这里传参使用小括号”()”不是用”{ }”
构造函数特点(续)
-
如果用户没有显式定义构造函数,C++编译器会自动生成一个无参的构造函数,但如果用户生成了编译器不再会自动生成
-
对于编译器自动生成的构造函数,有如下的作用:
1>该构造函数不会对编译器内置类型对象(int,float,double,char…)进行处理2>该构造函数会对自定义类型调用它的默认构造函数(注意默认构造函数与其他的构造函数在使用上有很大的区别,在后面会详细说),如果该自定义类型没有默认的构造函数,编译器会报错
注意事项
-
如果该自定义类型的构造函数为全缺省参数,编译器不会报错,当构造函数的参数中存在非缺省参数时,编译器会报错
-
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且一个类中默认构造函数只能有一个。
-
无参构造函数、全缺省构造函数,我们没写编译器默认生成的构造函数,都可以认为是默认构造函数
构造函数补充
- 一个类中默认构造函数只能有一个
- 一定要注意默认构造函数与普通构造函数的区别
- 实践中的总结
- 1>一般情况下,构造函数都需要我们自己去定义。
- 2>当一个类中没有内置类型成员变量,只有自定义类型变量时,我们可以对这个类不写构造函数,它会逐层调用其他自定义类型成员变量的构造函数
Q:关于编译器生成的默认成员函数,很多人会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依l日是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??
A:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。
注意:
- C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。
- 当我们自己写了构造函数(无论是否为默认的构造函数),编译器就不会自动生成默认的构造函数了,要么自己补充,要么使用关键字default强制编译器自动生成
- 在定义类中成员变量是进行变量声明并给出缺省值,而不是进行实例化后进行初始化,看起来非常像,但要注意区分。这里是给声明一个默认值(缺省值),当有其他值时不会使用该缺省值,包括构造函数