类和对象(下)
一、类的6个默认成员函数(空类也有)
二、构造函数
1.什么是构造函数
构造函数是一种随着对象创建而被调用的公有成员函数,有且仅在定义对象时自动执行一次,它的主要用途是为对象做初始化。
2.构造函数的特点:
- 函数名与类名相同
- 无返回值
- 编译器默认无参数
- 对象构造时系统自动调用对应的构造函数
- 构造函数可以重载
- 构造函数可以在类中定义,也可以在类外定义。
- 如果类定义中没有给出构造函数,则C++编译器自动产生一个默认的构造函数,但是如果我们自己定义了,系统就不会自动生成默认的构造函数。
- 无参的构造函数和全默认的构造函数都是默认构造函数,并且默认构造函数只能有一个。
3.初始化列表
格式:以一个冒号开始,接着是一个逗号分割的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。
注意点:1.每个成员在初始化列表中只能出现一次。
2.初始化列表仅用于初始化类的数据成员,并不指定这些数据成员的初始化顺序,数据成员在类中定义顺序就是初始化 列表中的初始化顺序。
3.尽量避免使用成员初始化成员,成员的初始化顺序最好和陈媛的定义顺序保持一致。
4.类中包含以下成员,一定要放在初始化列表位置进行初始化。
1) 引用成员变量
2)const成员变量
3)类类型成员(且对象所对应的类没有缺省的构造函数)
4.构造函数的作用
1)构造对象并且初始化
2)类型转化:对于单参构造函数,可以将其接收参数转化成类类型对象。
禁止类型转化:用explicit 修饰构造函数。
3)如果一个类未显式定义构造函数时,编译器会合成一个默认的构造函数(此构造函数一定不带参数),如果显式定义了,编译器将不再合成。
三、析构函数
1.什么是析构函数
当一个对象生命周期结束时,C++编译系统会自动调用一个成员函数,该成员函数就是析构函数。
2.析构函数的特点:
- 析构函数名是在类名前加上字符~。
- 无参数无返回值。
- 一个类有且只有一个析构函数。如果没有显示定义,系统会自动生成一个默认的析构函数。
对象声明周期结束时,C++编译系统会自动调用,析构函数体内不是删除对象(编译器来做),而是做一些对象删除前的相关清理工作。
四、拷贝构造函数
1.什么是拷贝构造函数
创建对象时使用同类对象来进行初始化,这时使用的构造函数为拷贝构造函数。
2.拷贝构造函数函数的特点:
- 拷贝构造函数其实是一个构造函数的重载。
- 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
- 若未显示定义,系统会默认生成拷贝构造函数,默认的拷贝构造函数会按照成员的声明顺序依次拷贝类成员进行初始化。
五、运算符重载
1.作用:为了增强程序的可读性。
2.运算符重载的特征:
- operator + 合法的运算符 构成函数名
- 重载运算符以后,不能改变运算符的优先级 / 结合性 / 操作数个数
3. 5个C++不能重载的运算符: .* :: sizeof ?: .
六、赋值操作符重载
1.赋值运算符的重载是对一个已经存在的对象进行拷贝赋值
2.当程序没有显示地提供一个本类或本类的引用为参数的赋值运算符重载函数时,编译器会自动生成一个这样一个赋值运算符重载函数。
七、深浅拷贝问题
1.深拷贝:如果一个类拥有资源(堆,或是其他系统资源),当这个类的对象发生复制过程的时候,资源也进行相应复制。
2.浅拷贝:如果一个类拥有资源(堆,或是其他系统资源),当这个类的对象发生复制过程的时候,并未复制资源。
八、类的const成员函数
const修饰类成员:
1.const 修饰类成员变量时,该成员变量 必须在构造函数的初始化列表中初始化。
2.const修饰类成员函数,实际修饰该成员函数的this指针,该成员函数中不能对类的任何成员进行修改。
3.在const修饰的成员函数可能需要对某个成员变量进行修改,该成员变量只需被mutable关键字修饰即可。
注意点:
const对象可以调用const成员函数,不可以调用非const成员函数。
非const对象对const成员函数和非const成员函数都可以调用。
const成员函数可以调用const成员函数,不可以调用非const成员函数。
非const成员函数对const成员函数和非const成员函数都可以调用。
九、取地址操作符重载及const修饰的取地址操作符重载
这两个默认成员一般不用重新定义,除非你只是想让别人获取到你指定的内容。
十、友元
1.分类:友元函数和友元类
2.友元函数:可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,在类的内部声明,声明时要加上
friend 关键字。
1).说明:
友元函数可以访问类的私有成员,但不是类的成员函数。
友元函数不能用const修饰。
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数。
友元函数的调用与普通函数的调用和原理相同。
3.友元类:友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
4.友元的特点:
友元关系是单向的,不具有交换性。
友元关系不能传递
友元关系不能继承
5.友元的优缺点:
优点:提高了程序运行效率
破坏了类的封装性和隐藏性
十一、static成员
1.概念:声明为static 的类成员称为类的静态成员,用static 修饰的成员变量,称之为静态成员变量 ;用static 修饰的成员函 数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。
2.特性:
1)静态成员为所有类对象所共享,不属于某个具体的实例。
2) 静态成员变量必须在类外定义,定义时不添加static关键字。
3) 类静态成员可用 类名::静态成员 或者像普通对象成员来访问。
4) 静态成员函数没有隐藏的this指针,所以不能访问任何非静态成员。
5) 静态成员和类的普通成员一样,也有public、protected、private3中访问级别,也可以具有返回值,const修饰等参数。
3. 问题:
1) 静态成员函数可以调用非静态成员函数吗?
分析:不可以。因为静态成员函数没有this 指针,而非静态成员函数需要传递this指针来访问。
2) 非静态成员函数可以调用类的静态成员函数吗?
分析:可以。因为静态成员为所有类对象所共享。