再探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++默认成员函数的介绍就到这。还有俩个默认的成员函数,但是基本上用不到 ,就不做介绍,对于构造函数是重要的一项,希望本文对大家有所帮助!

相关推荐
Python×CATIA工业智造1 小时前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
十五年专注C++开发2 小时前
CMake基础:条件判断详解
c++·跨平台·cmake·自动化编译
我叫小白菜2 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄2 小时前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python
weixin_446122463 小时前
JAVA内存区域划分
java·开发语言·redis
悦悦子a啊3 小时前
Python之--基本知识
开发语言·前端·python
QuantumStack4 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6734 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext4 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)5 小时前
后端快捷代码
java·开发语言