【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强制编译器自动生成
 - 在定义类中成员变量是进行变量声明并给出缺省值,而不是进行实例化后进行初始化,看起来非常像,但要注意区分。这里是给声明一个默认值(缺省值),当有其他值时不会使用该缺省值,包括构造函数
 

