目录
目录
函数模板
函数指针语法基础
1. 定义一个函数类型
typedef int (MYFuncType)(int);
void test(int a) {
cout << "a= " << a << endl;
}
int main() {
{
//方法1
//定义一个函数类型
typedef void (FUN)(int);
FUN *f1 = test; //函数指针变量
//通过函数指针变量,可以找到函数入口,可以执行函数
f1(1);
}
}
2. 定义一个函数指针类型
void test(int a) {
cout << "a= " << a << endl;
}
int main() {
{
//方法2
//定义了一个函数指针类型
typedef void (*PFun)(int);
PFun pFun;
pFun = test;
pFun(1);
}
}
泛型编程
template关键字告诉c++编译器,现在我要进行泛型编程
typename 告诉c++编译器,T为数据类型
template<typename T>
void myswap3(T &a, T &b)
泛型编程函数的使用方法有2种
1. 自动类型推导调用
2. 具体类型调用
//函数模版
template <typename T>
void swap3(T& a, T& b) {
T c = a;
a = b;
b = c;
}
int main() {
int a = 1;
int b = 2;
//自动类型推导
swap3(a, b);
std::cout << "a=" << a << ", b=" << b << endl;
char m = 'a';
char n = 'b';
//具体类型调用
swap3<char>(m, n);
std::cout << "m=" << m << ", n=" << n << endl;
return 0;
}
结果
a=2, b=1
m=b, n=a
类模版
类模版由模版说明和类说明构成
template <类型形式参数表>
类声明
例如
template <typename Type>
class A {
private:
Type DateMember;
}
普通示例
template <typename T>
class A {
private:
T a;
public:
T getA() {
return a;
}
void setA(T a) {
this->a = a;
}
};
void printA(A<int> *p) {
cout << "a: " << p->getA() << endl;
}
void printA(A<char> *p) {
cout << "a: " << p->getA() << endl;
}
int main() {
A<char> a1;
a1.setA('c');
printA(&a1);
A<int> a2;
a2.setA(2);
printA(&a2);
return 0;
}
含继承的示例
template <typename T>
class A {
private:
T a;
public:
A(int a) {
this->a = a;
}
T getA() {
return a;
}
void setA(T a) {
this->a = a;
}
};
void printA(A<int> *p) {
cout << "a: " << p->getA() << endl;
}
void printA(A<char> *p) {
cout << "a: " << p->getA() << endl;
}
class B: public A<int> {
private:
int c;
public:
B(int a): A<int>(a) {
}
};
int main() {
B b(1);
printA(&b);
return 0;
}
友元函数的示例
template <class T>
class A {
private:
T Real;
T Image;
public:
A(T Real, T Image) {
this->Real = Real;
this->Image = Image;
}
friend A operator+(A& a, A& b) {
A tmp(a.Real - b.Real, a.Image - b.Image);
return tmp;
}
void printA() {
cout << "Real = " << this->Real << ", Image=" << this->Image << endl;
}
};
int main() {
A<int> a(1, 2);
A<int> b(4, 5);
A<int> c = a + b;
c.printA();
return 0;
}