目录
八、函数模板(Function Template)
1、定义
所谓函数模板,实际上就是建立一个通用函数
-
函数定义时不指定具体的数据类型(使用虚拟类型代替)
-
函数被调用时编译器根据实参反推数据类型-类型的参数化
//模板头与函数声明/定义永远是不可分割的整体
template<typename 类型参数1, typename 类型参数2,...>
返回指类型 函数名(形参列表)
{
//在函数中可以使用类型参数
}
//函数声明
template<typename T> void swap(T&, T&)); //虚拟类型T
//使用模板技术实现变量交换值
template<typename T> //模板头
void swap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
example:
#include <iostream>
using namespace std;
//函数声明
template<typename T> void sort(T tarray[], int len); //虚拟类型T
template<typename T> void show(T tarray[], int len); //虚拟类型T
int main()
{
int inums[] = {56,54,12,89,43};
float fnums[] = {78.0f,5.7f,42.8f,99.1f};
double dnums[] = {78.9,23.6,77.8,98.5,33.3};
cout << "Before sorting :";
show(inums, sizeof(inums) / sizeof(inums[0]));
sort(inums, sizeof(inums) / sizeof(int));
cout << "After sorting:";
show(inums, sizeof(inums) / sizeof(inums[0]));
cout << "Before sorting :";
show(fnums, sizeof(fnums) / sizeof(fnums[0]));
sort(fnums, sizeof(fnums) / sizeof(float));
cout << "After sorting:";
show(fnums, sizeof(fnums) / sizeof(fnums[0]));
cout << "Before sorting :";
show(dnums, sizeof(dnums) / sizeof(dnums[0]));
sort(dnums, sizeof(dnums) / sizeof(double));
cout << "After sorting:";
show(dnums, sizeof(dnums) / sizeof(dnums[0]));
}
//使用模板技术实现变量交换值
template<typename T> //模板头
void sort(T tarray[], int len)
{
T temp;
for(int i = 0;i < len - 1; i++)
{
for(int j = 0; j < len -i - 1; j++)
{
if(tarray[j] > tarray[j+1])
{
temp = tarray[j];
tarray[j] =tarray[j + 1];
tarray[j + 1] = temp;
}
}
}
}
template<typename T>
void show(T tarray[], int len)
{
for(int i = 0; i < len; i++)
{
cout << tarray[i] << ",";
}
cout << endl;
}
九、抽象和类
面向对象:基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统(模拟现实)
-
对象是由数据和容许的操作组成的封装体,与客观实体有着直接对应关系
-
面向对象不是某一种语言的特性,而是一种编程思想
-
面向对象编程(OOP)特性:抽象、封装和数据隐藏、多态、继承、代码的可重用性
1、C++中的类
-
类是一种将抽象转换为用户定义类型的工具
-
将数据表示和操纵数据的方法组合成一个整体
-
类的实例称为对象,对象的集合称为类
-
类中的变量和函数称为成员
-
类是对象的模板
2、类的声明
使用class/struct
class 类名{}; //s声明的类型默认成员是私有的(private)
struct 类名{}; //声明的类型默认成员是公有的(public)
注意:
-
class方式声明的类型与struct声明的类型仅仅是形式上不同
-
其唯一的区别在于使用class声明的类型默认成员是私有的(private),而struct声明的类型默认成员是公有的(public)
3、访问修饰符
常见访问修饰符:
-
public:修饰的成员在任意地方都可以访问
-
private:修饰的成员只能够在类中或者友元函数中可以访问
-
protected:修饰的成员可以在类中函数、子类函数及友元函数中访问
修饰成员:
-
将修饰关键字放置在类定义的大括号中,添加冒号
class 类型
{
修饰符:
成员列表;
};
例如:
class LandOwnerV1
{
public: //公有
LandOwnerV1(); //构造函数的声明
virtual ~LandOwnerV1(); //析构函数的声明
void TouchCard(int cardcount);
void showscore();
private: //私有
string name; //地主的名称
long score; //地主的积分
int cards[20]; //地主的手牌数组
};
4、类的成员函数
-
函数声明:
class 类名
{
修饰符1:
变量1类型 变量1名称;
变量2类型 变量2名称;
修饰符2:
函数1返回类型 函数1名称();
}
例如:
class LandOwnerV1
{
public:
void showscore();
private:
string name; //地主的名称
long score; //地主的积分
int cards[20]; //地主的手牌数组
};
-
函数定义
返回类型 类名::函数名() //::为作用域解析运算符
{
//函数操作
}
例如:
void LandOwnerV1::TouchCard(int cardcount)
{
cout << name << "touched" <<cardcount << "cards" << endl;
}
注:无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于隐藏数据是面向对象编程(OOP)主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;否则,就无法从程序中调用这些函数