- 输入:采用标准输入流对象
istream
和提取运算符cin>>
- 输出:采用标准输出流对象
ostream
和插入运算符cout<<
一名多用,要求重载函数的参数个数或类型与原来的不同
给功能相似的函数建立一个统一的模板
- 要求:函数的参数个数和原来的要相同
- 格式:
template <typename T>
通用函数定义
相当于给变量起一个别名,变量和其引用共享同一内存空间
e.g.
int a; int &b = a; //声明b是一个int型变量a的引用
String类
- 格式:
new 类型(初值) //返回一个指向数据类型的指针 new 类型[num] //new一个含有num个元素的类型数组 delete [ ] 指针变量 //[ ]表示对数组空间操作,可选
2.1 瀵硅薄
包含作为属性的数据成员和作为行为的成员函数,成员函数用来对数据进行操作,以便实现某些功能。
- 面向过程程序设计: 程序=数据结构+算法
- 面向对象程序设计: 对象=数据结构+算法, 程序=对象s+消息
- 抽象:将有关事物归纳集中,作用是表示同一类事物的本质。类是对象的抽象,而对象是类的具体表现形式。
- 封装:将数据和操作数据的函数绑定在一起,将具体的实现细节隐藏起来,仅对外保留接口。
- 继承:利用已有类建立新类,新类从已有类中获得其意义特性的机制。
- 多态:不同的对象对接收到的同一消息会产生不同的行为的现象(单接口,多实现)
类声明格式:
class 类名 { private: 私有的数据和成员函数; public: 公用的数据和成员函数; };
对象定义格式
类名 对象名;
- 类成员函数可访问本类中的任何成员,一般将需要被外界调用的成员函数指定为public,它们是类的对外接口
- 对于函数体较短(三行以内)的成员函数可在类内声明和定义,对于一般的成员函数,一般在类内声明,在类外定义(别忘了加类名和域运算符
::
)
- 通过对象名和成员运算符
.
访问对象中的成员 - 通过对象的引用和成员运算符
.
访问对象中的成员 - 通过指向对象的指针
p->
访问对象的成员
- 利用构造函数对对象进行初始化(包括用参数初始化表)
- 利用析构函数进行清理等工作
- 构造和析构函数执行的顺序:后构造的先析构(类似栈)
能在同类的多个对象之间实现数据共享,在内存中只占一份空间。静态数据成员为类所有,而不是属于某个对象,因此不能在构造函数中初始化,只能在类体外初始化。
格式:
static 类型名 变量名;
用关键字friend
声明
友元函数又分两种,将普通函数声明为友元函数和友元成员函数
是类的抽象,实现一类多用
格式:
template <class 类型参数名> 类模板声明
格式:
函数类型 operator运算符(形参表) //"operator运算符"就是运算符重载函数名 { 对运算符的重载处理}
- 做类成员函数:常用于单目运算符重载
- 做友元函数: 常用于双目运算符重载
除了以下5种运算符之外,其它运算符一般都能进行重载。
不能进行重载的5种运算符:
- 成员访问运算符
.
& 成员指针访问运算符.*
- 作用域运算符
:
& 长度运算符sizeof
:操作对象是类 - 条件运算符
? :
- 重载流提取运算符
>>
:istream& operator>>(istream& input, 自定义类&)
- 重载流插入运算符
<<
:ostream& operator<<(ostream& output, 自定义类&)
- 其它数据类型->类对象:使用转换构造函数
- 类对象->另一类型数据:使用类型转换函数 ,格式
operator 要转换成的类型名 {实现转换的语句}
利用已有类(父类,也叫基类)建立新类(子类,也叫派生类),新类从已有类中获得其意义特性,对父类而言叫派生,对子类而言叫继承(个人理解)。
- 单继承:一个派生类只从一个基类继承
- 多重继承:一个派生类有多个基类
派生类是基类的具体化,而基类是派生类的抽象
class 派生类名:[继承方式] 基类名 {派生类新增加的成员}
包括从基类继承过来的成员和自己增加的成员
- 公有继承public:基类的公有(public)和保护(protected)成员在派生类中保持不变
- 私有继承private:基类的公有和保护成员均变成派生类的私有成员(私有成员在派生类中不可访问)
- 保护继承protected:基类的公有和保护成员均变成派生类的保护成员(介于公有成员和私有成员之间,能被本类和本类的派生类所访问)
在一个类中以另一个类的对象作为数据成员。组合和继承都是有效利用已有类的资源,不过继承是纵向的“是”的关系,组合是横向的“有”的关系。
不同的对象在接收到同一消息时会产生不同的行为(单接口多实现),其中消息指调用函数,不同的行为指不同的实现。
- 静态(编译时的)多态性: 通过函数重载实现
- 动态(运行时的)多态性: 通过虚函数实现
- 含义
用virtual
在基类中声明为虚拟的,在派生类中才正式定义的函数 - 作用
允许在派生类中定义与基类同名的函数,并可通过基类指针或引用来访问基类和派生类中的同名函数 - 用法
(1)在基类中用virtual声明虚函数
(2)在派生类中按需重新定义此函数,函数头(接口)要保持一样
(3)定义指向基类对象的指针变量,使其按需指向调用该虚函数的对象
(4)通过该指针变量调用此虚函数
确定调用的具体对象的过程,分静态关联和动态关联
- 静态(早期)关联:在程序编译时即可确定,如函数重载、通过对象名调用的虚函数
- 动态关联:在运行阶段才能确定关联关系,如通过基类指针调用的虚函数
将基类的析构函数声明为虚函数(能保证在撤销动态分配的空间时继承体系中的各对象能得到正确的处理)
- 纯虚函数:在声明虚函数时被初始化为”0”的函数(“有名无实”,待派生类定义),一般形式
virtual 函数类型 函数名(参数列表) = 0;
- 抽象类:不用来定义对象而是作为一种基本类型用作继承的类。凡是包含纯虚函数的类都是抽象类,其作用是作为一个类族的共同基类。
e.g.
Shape类作为抽象类,ShapeName()作为纯虚函数。在此基础上,可依次定义Point类、Circle类、Cylinder类构建继承体系,并在对应类声明中按需重新定义ShapeName()虚函数。
文章来源: 谭浩强《C++面向对象程序设计》知识点总结