目录
前言
什么是默认成员函数
构造函数
概念
特性
析构函数
概念
特性
拷贝构造函数
概念
特性
赋值运算符重载
特性
前言
很久没有更新文章了,最近把类和对象相关的知识重新回顾了一遍,打算从今天开始继续更新C++从入门到入土系列。前面我们简单的介绍了类和对象,本期我将继续深入和大家探讨类和对象当中重要的6个默认成员函数,相信看完本篇文章您会对类和对象有更深入的理解,话不多说,我们正式开始。
什么是默认成员函数
简单来说,默认成员函数就是指:用户没有显示实现,编译器会自动生成的成员函数称为默认成员函数,如果用户显示写了就不会自动生成。
一共分为三大类,初始化和清理(构造函数、析构函数),拷贝复制(拷贝构造、赋值重载),取地址重载(普通对象取地址、const对象取地址)。
构造函数:主要完成对象的初始化工作
析构函数:主要完成对象的清理工作
拷贝构造:使用同类对象初始化创建对象
赋值重载:把一个对象赋值给另一个对象
取地址重载:主要是对普通对象和const对象取地址
构造函数
我们在用C语言写代码时会出现一个问题,有时忘记对数据进行初始化从而导致程序运行发生崩溃,于是C++为了解决这个问题引入了构造函数这个概念
概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象生命周期内只调用一次。
特性
1.函数名与类名相同
2.无返回值
3.对象实例化时编译器自动调用对应的构造函数
4.构造函数可以重载
5.如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成
下面我将依次讲解上述特性:
首先构造函数是可以支持重载的,通过对构造函数进行缺省参数我们可以写多个初始化方式,例如:
假如我们没有写默认构造函数则会发生什么呢?我们观察下面代码:
当我们把构造函数屏蔽之后再重新运行代码之后我们发现出现了随机值,前面我们知道,如果我们不显示写构造函数那么编译器会默认生成构造函数,但是为什么编译器自动生成的默认构造函数会出现随机值呢?原因在于:C++把类型分为内置类型和自定义类型。内置类型就是语言提供的数据类型,自定义类型就是struct/union等自己定义的类型,对于内置类型没有规定要不要处理,自定义类型取调用它的无参构造,没有无参构造就会报错。
此时我们发现,C++语法自动生成的默认构造函数似乎没有什么用处,因此C++11中针对这一缺陷规定了:内置类型的成员变量在声明时可以给默认值,
那么什么是默认构造呢?总的来说,不传参数就可以调用的函数就是默认构造,如果没有默认构造就会报错,其中包括:无参构造函数、全缺省构造函数、我们没有写编译器自动生成的构造函数。
析构函数
概念
与构造函数功能相反,析构函数是在对象销毁时自动调用的函数,完成对象中资源清理的工作。
特性
1.析构函数名是在类名前加上字符~
2.无参数无返回值类型
3.一个类只能有一个析构函数,若未显示定义则系统会自动生成默认的析构函数(析构函数不能重载)
4.对象生命周期结束时自动调用析构函数
5.内置类型不做处理,自定义类型去调用它的析构函数
6.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数
拷贝构造函数
概念
特性
1.拷贝构造函数是构造函数的一个重载形式
2.拷贝构造函数的参数只有一个且必须是对类类型对象的引用,使用传值方式直接报错,会引发无穷递归
3.若未显示定义编译器会生成默认的拷贝构造函数。默认生成的拷贝构造函数对象按内存存储字节序完成拷贝,这种拷贝叫浅拷贝,也叫值拷贝。
4.适用场景:使用已存在的对象创建新对象;函数参数类型为类类型的对象;函数返回值类型为类类型的对象
赋值运算符重载
C++为了增强代码的可读性引入了赋值运算符重载,其格式是operator后面接需要重载的运算符符号,例如:operator==、operator+=、operator-=。为什么要引入赋值运算符重载呢?我们在使用C语言写代码时有时会出现这样的问题:我们要写一个加减函数或者比较两个数字大小的函数时我们所取的函数名有时不能反映函数的功能,于是为了解决这一问题C++引入赋值运算符重载这一语法,用operator加操作符代替函数名可以清楚反应函数的功能,同时我们在调用时可以和自定义类型的调用类似,极大增强了代码的可读性。
需要注意的是:重载的操作符必须有一个类类型的参数,用于内置类型的运算符其含义不能改变;作为类成员函数重载时,其形参看起来比操作数少1,因为成员函数的第一个参数为隐藏的this;.* :: sizeof ?: .这五个操作符无法重载。
特性
1.格式:参数类型:const T&,传引用提高效率;返回值类型:T&,有返回值是为了支持连续赋值;检测是否自己给自己赋值;返回*this
2.赋值运算符只能重载成类的成员函数,不能重载为全局函数。如果要重载为全局无法访问私有成员,解决方法:提供这些成员的get和set;友元;重载为成员函数。
3.用户没有显示写时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝
以上就是本文的全部内容,受限于博主的知识水平,可能文章中有些许不足,欢迎大家指正。如果本文对您有帮助的话记得点赞收藏加关注,您的点赞就是对我最大的鼓励。