重载(函数/运算符)属于静态多态性(编译时的多态性)
虚函数属于动态多态性(运行时的多态性)
多态性:操作接口具有表现多种形式的能力(能根据操作环境的不同采用不同的处理方式)
分类:重载多态、强制多态、多态多态、参数多态
绑定是指把一个标识符名和一个存储地址联系在一起,分为动态绑定(工作运行阶段进行)和静态绑定(编译连接阶段进行)
运算符重载:
不能重载的运算符:”.”、“.*”、“::”、“?::”
不改变原有的优先级和接合性
重载方式:类的静态成员函数、非成员函数(主要运算对象,一般会声明为友元函数)
重载形式:
函数类型 operator 运算符 (形参) { }
Obj1 + Obj2: 函数名 防止被修改 节省空间
类型为成员函数时:参数个数=源操作数-1(后置++、--除外) Obj1.operator + (const &Obj2) const { }
Complex Complex::operator + (congest Complex &c2) const
前置单目运算符(无形参) U oprd = oprd.operator U()
后置双目运算符 oprd++ = oprd.operator ++ (o)
//后置++返回一个副本,但本身已经+1了
类型为非成员函数时: 参数个数=原操作数个数,但至少有一个自定义操作类型的参数
流运算符(>>/<<)只能重载为非成员函数,因为其左操作数只能是流对象(ostream/istream)
动态多态性(虚函数)
Virtual void Function() { } 不进行早绑定,运行时用指针来确定具体函数体(编译器自动准备了虚函数表)
实现原理:在类中有一个特殊的指针指向虚函数表(无法显式访问),不同的对象通过调用该指针来访问虚函数表。
虚析构函数:通过基类指针来删除派生类对象。
模板
函数模板 template<模板参数表>
(类型<class>、常量参数<类型 标识符>、模板参数<template <> class 标识符>)
template < typename T >
T Abs(T x)
{ return x<0? –x:x; }
类模板
template <模板参数表>
Class 类名 { 内容 };
类外调用: Template< X >
类型名 类名<模板参数标识符列表> :: 函数名(参数列表)
派生类调用: Store<double> Stud1,Stud2; //类模板调用前需要先对类模板进行实例化
类中不改变对象数据的函数可以定义为const如: int GetSize() const
线性结构:
访问方法:直接访问(a[3])、顺序访问(从第一个开始依次访问)、索引访问
数组: 静态数组:大小在编译时确定、无法修改大小
动态数组(自定义Arry类):元素个数可以在运行时改变(开销较大 删除原数据结构重新生成新的数据结构)// vector就是用类模板实现的动态数组
Ps. 重载函数的返回值-
返回引用(&T)可以放到等号的左边进行赋值操作,返回静态数据(const T)无法进行赋值操作,但是可以防止意外更改。
链表:由结点组成,每个结点包含数据域和指针(rear)
插入: 1.新节点的指针先指向后继对象(防止内存泄露 )
2.断开原连接
3.前趋对象指针连接到新节点上
template <class T>
void Node<T>::insertAfter(Node<T> *p)
{
p->next = next;
next = p;//当前节点的指针指向p
}
删除:
链表基本操作:生成结点、插入、查找、删除、遍历链表、清空链表
栈和队列
栈:用于运算多项式
略(详见数据结构)
队列:略