一.函数重载
返回值类型 + operator + 操作符符 + (参数)
本质定义一个函数,在函数体内内部实现实现想要的功能,当我们用到该重载操作符时,编译器自动识别调用这个函数
类内重载参数至多一个
两个参数在类外实现,一般设为友元函数来使用类成员
注意事项:
1.不是所有运算符都能重载,sizeof长度运算符 ,:?条件运算符, .成员选择符
::域解析符 不能被重载
2.重载运算符并没有改变符号的优先级和结合性
3.重载运算符不能有默认参数
右++重载时 有一个参数 int operator ++ (int n) 表示后置形式
左++没有参数
输入输出重载
输入 : 类外重载操作符
istream &operator >> (istream &is,类名 &对象)
{
is >> duixiang.特性
return is;//因为需要连着输入
}输出
将istream改为ostream
二 .单例模式
特点:只能创建一个对象
把构造函数和拷贝函数设为私有,定义一个本函数的静态指针,定义一个静态函数用来创建对象,当对象存在时返回本函数指针,否则创建一个对象
三.模板模式
定义一个算法流程,将一些特定步骤的具体实现延迟到子类
使得在不改变算法流程的情况下,通过不同的子类来实现定
制流程中的特定步骤
四.关于头文件
<>直接引入系统头文件
""引入自定义头文件,先在自定义找,找不到再到系统头文件找,相当于在编译期把头文件放到文件前面
多文件编程时把 类放在.h中定义,在.pp中实现
多写造成文件重复包含有两种方式解决
1.c语言中常用
#ifndef 加 宏名
#define 加宏名
头文件内容
#endif
2.在头文件中加一句
#pragma once // 只编译一次 一定放在顶格第一行
五.模板函数
———————————————————————————————————————————
模板函数在使用的时候必须定义和声明要在同一个文件里
或者声明在头文件里但是定义在主函数中
———————————————————————————————————————————
建立一个通用的函数,他用到的数据类型可以不具体指定,用一个虚拟类型代替等函数调用时根据传递的参数逆向推导出真正的类型
template <typename T>
没有函数指针
类外实现必须加模板头函数,还需要参数列表<类型>
模板头函数
函数类型 + 作用域<参数类型> + (参数)
定义对象时也得加参数列表
全局函数 模板函数使用方法
#include<iostream>
using namespace std;
template <typename T>
void show(T a)
{
cout << a << endl;
}
template<typename T,typename T2>
void show(T a, T2 k)
{
}
int main()
{
show(12);
show("dfas");
show('a');
system("pause");
return 0;
}
类模板函数使用方法,以队列为例
#include<iostream>
using namespace std;
template <typename T>
class que
{
public:
struct k
{
T a;
k* pnext;
};
k *phead;
k *pend;
que();
T pop();
void pushback(T a);
};
template <typename T>
que<T>::que()
{
phead = NULL;
pend = NULL;
}
template <typename T>
T que<T>::pop()
{
T a = phead->a;
k * ptemp = phead;
phead = phead->pnext;
delete ptemp;
return a;
}
template <typename T>
void que<T>::pushback(T l)
{
k *ptemp = new k;
ptemp->a = l;
ptemp->pnext = NULL;
if(phead == NULL)
phead = ptemp;
else
pend->pnext = ptemp;
pend = ptemp;
}
int main()
{
que<float> q;
for(int i = 1;i <= 10; i ++)
{
q.pushback(2.3);
}
for(int i = 1; i<= 10;i ++)
{
cout << q.pop() << " " ;
}
system("pause");
return 0;
}