本课程将带领大家体会更为奇妙的C++,讲述了静态、友元、运算符重载的定义及使用方法,其中重点讲述函数模板、类模板以及标准模板库的相关知识,知识内容更重实用性,本门课程对于面向对象的语言的学习将大有裨益,所有知识均以实践的方式讲解到操作层面,力求即学即会。
1 课程简介
2 友元函数和友元类
说明: 无论时友元类还是友元函数
- 友元的声明不受访问限定符的影响,可以声明载类中的任何位置。
- 友元关系不可传递,A 是 B 的友元,B 是 C 的友元,不代表 A 是 C 的友元。
- 友元声明的形式及数量不受限制。
- 友元具有单向性,A是B的友元,B不一定是A的友元。
- 友元函数和友元类必须使用关键字friend定义。
2.1 友元函数
友元全局函数
说明: 在类中声明全局函数为友元,则全局函数就可以访问类中的私有成员。
1 |
|
友元成员函数
说明:在类 A 中声明类 B 的成员函数 fun 为友元,则类 B 的 fun 函数就可以访问类 A 中的私有成员。
1 |
|
2.2 友元类
说明: 在类 A 中将类 B 声明为友元,则类 B 可以访问 B 类中类 A 型属性的私有成员 。
注意: 由于编译器不同,友元类有两种声明形式:1、friend class 类名
; 2、friend 类名
建议:友元只是封装的补充,事实上对封装性是一种破坏,设计良好的程序应该避免使用友元。
1 |
|
3 static
说明: 包括静态数据成员
或静态成员函数
- 定义静态成员函数和静态数据成员都需要 static 关键字
- 公有静态成员函数可以被类直接调用
- 静态数据成员不能在构造函数初始化,必须单独初始化
- 静态成员函数不能调用非静态成员函数和非静态数据成员
- 静态数据成员只有一份,且不依赖对象而存在
限制:静态成员函数不能用 const 修饰,因为 const 本质上是修饰的隐式提供给成员函数的 this ,但静态成员函数实际上没有 this。
访问:从内部和外部两个角度看
类外部访问静态成员
: 可以通过类直接访问,也可以通过实例化的对象访问。类内部访问静态成员
: 只有静态方法可以访问静态成员,且只能访问静态成员。
3.2 综合 DEMO
1 |
|
4 运算符重载
描述: 给原有运算符赋予新功能
关键字: operator
4.1 一元运算符重载
负号
成员函数运算符重载
1 |
|
友元函数运算符重载
1 |
|
++
1 |
|
4.2 二元运算符重载
加号
成员函数重载
1 |
|
友元函数重载
1 |
|
<<
注意: 输出运算符不可以采用成员函数重载,因为采用成员函数实现重载第一个参数默认时当前对象,而重载输出运算符第一个参数必须是 ostream
类型的。
友元函数运算符重载
1 |
|
[]
注意: 不能使用友元函数来重载索引运算符。
成员函数运算符重载
1 |
|
5 模板函数和模板类
5.1 函数模板
5.1.1 基础
关键字 tymplate
、typename
、class
(不是定义类),其中 typename 和 class 可以相互替换。
说明: 当需要定义多个功能相同,数据类型不同的函数时,可以使用函数模板。
- 无论是类型还是值都可以模板化处理,甚至可以混在一起使用。
- 函数模板的参数个数可以时一个,也可以是多个。
- 使用函数模板时,需要指定模板参数,此时的函数称为
模板函数
。
1 |
|
5.1.2 函数模板与函数重载
说明: 函数模板也存在重载。
1 | template <typename T> |
5.2 类模板
- 类模板声明和实现要写在同一个文件中
- 外联实现的成员函数都需要分别声明模板(虽然看起来有点多余…)
1 | . |
MyArray.h
1 |
|
main.cpp
1 |
|
6 标准模板类
说明: STL (Standard Template Lib)
,即标准模板库,下面介绍一些常用的。
6.1 vector 向量
说明: 对数组的封装,读取能在常数时间完成,可理解为一个可变长度的数组。
1 |
|
6.2 list 链表
特点: 数据插入数据快
1 |
|
6.3 map 映射
1 |
|