再探C++——默认成员函数

目录

一、构造函数

二、析构函数

三、赋值运算符

四、拷贝构造


如果一个类中没有成员,我们称为空类。空类,也存在6个默认的类成员函数。

默认成员函数:用户不显示地写,编译器会默认生成的函数叫做默认成员函数。

6个默认成员函数:
构造函数:完成对象初始化               析构函数:完成对象清理

拷贝构造:用同类对象构造新类        赋值重载:把一个对象赋给另一个对象

取地址重载:很少涉及

一、构造函数

在C语言中,一个数据结构的模拟首先要完成初始化,就拿栈举例子:

初始化要确定top,确定开辟的空间,和数组的初始容量。如果没有完成这一初始化会出现诸多问题,为了防止遗忘类的初始化,引入构造函数。

在类的创建时自动调用,用来进行初始化。

1.特性:

1)名称与类名相同,没有返回值。

2)不是开空间创建对象,是在实例化后自动调用。

3)可以重载

拿日期类举例子

.构造函数可以是重载   重载要注意二义性

.关于重载的调用

在调用无参构造函数时 不可写成  Date d1();否则编译器将认为这是一个函数声明

.在函数重载中给缺省值

关于带参函数给全缺省,那么它与无参构造函数都为默认构造函数,不需要用户显示调用,编译器就能初始化。

默认构造函数只能出现一个,全缺省不能与无参构造函数同时出现。

 在类中既有无参构造函数和全缺省构造函数,编译器能通过编译 但在创建对象时会出现二义性,不知道调用哪个函数,会出错。

5)编译器会生成默认的构造函数

如果用户没有自己显示的实现一个构造函数,那么编译器会生成一个无参的默认构造函数。

编译器生成的默认构造函数特点:

内置类型初始化为随机值自定义类型会调用其的构造函数。

 类B的默认构造函数在初始化时aa时,会调用A的构造函数,而b初始化为随机值。

6)初始化列表

 对于引用和const类型的对象,在定义时必须进行初始化,而构造函数的函数体为赋值语句,无法进行初始化;

因此引入初始化列表,在对象创建时即完成初始化工作。

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟
一个放在括号中的初始值或表达式

 注意:

每个成员在初始化列表只能出现一次

引用和常对象,需要传参的自定义类型必须在初始化列表中初始化;

初始化列表的初始化顺序只与类对象声明顺序有关;

二、析构函数

在一个类对象结束,要进行动态内存的释放。为了防止用户遗忘,引入析构函数,在对象生命周期结束时,自动调用,完成对象的内存清理工作。

 特性:
1)函数名为 类名前加~  (表示与构造函数相对)

2)没有参数 ,没有返回值

3)编译器会生成默认构造函数
与构造函数一样,用户没有显示写析构函数时,编译器会自动生成析构函数

内置类型不做回收自定义类型调用的析构函数。

4)调用顺序类似栈结构,创建的类,调用析构函数。

三、赋值运算符

C++为了增强代码的可读性,引入赋值运算符=

赋值运算是针对俩个已经存在的类;

关键字:operator =  有函数参数和返回值

特性:

1)在用户不显示写时,编译器会生成默认赋值运算符,其的特点是浅拷贝

浅拷贝:将目标一个字节一个字节的拷贝给目的地

涉及一块空间的拷贝不能用浅拷贝:同一块空间不能连续释放两次;因此用户自定义赋值运算符重载就非常有必要。

2)返回值是T&,减少传值的拷贝,可以连续拷贝   

     参数类型const T&  防止被错误修改

3)隐藏第一个参数this指针  ,检查拷贝的来源是否为自己

3)不可重载为全局函数

全局函数没有this指针,需要传所有参数

四、拷贝构造

将已经存在的类,拷贝给一个新类;

其是构造函数的一个重载

 在传参时必须用引用接收参数;

否则 不带引用;会发生无限递归

要拷贝构造就要传参  传参就要调用拷贝构造  调用拷贝构造就要传参 ..........会发生无限递归

1)用户不显示写时,编译器会产生默认拷贝构造函数,是浅拷贝;

在涉及动态空间时,必须显示实现一个拷贝构造函数,否则会发生同一块空间释放俩次;

2)对象返回时,能返回引用,尽量返回引用,提高效率;

区别拷贝构造和赋值的调用

 拷贝构造是一个存在的类对象,赋值是俩个类都存在;

———————————————————————————————————————————

本期的C++默认成员函数的介绍就到这。还有俩个默认的成员函数,但是基本上用不到 ,就不做介绍,对于构造函数是重要的一项,希望本文对大家有所帮助!

猜你喜欢

转载自blog.csdn.net/m0_73299809/article/details/131987899