最近在学习 C++,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习C++的童鞋们提供一份参考。
函数指针
函数指针基础
函数三要素: 名称、参数、返回值
C语言中的函数有自己特定的类型
1 2 3 4 5
| typedef type name(parameter list) typedef int f(int, int); typedef void p(int);
|
函数指针应用
函数指针用于指向一个函数
函数名是执行函数体的入口地址
pointer为函数指针变量名
type为指向函数的返回值类型
parameter list为指向函数的参数类型列表
函数指针做函数参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <stdio.h> #include <stdlib.h> #include <string.h>
int add(int a, int b) { int c; c = a + b; printf("c = %d\n", c); return c; }
int MyOP(int (*myAdd)(int ,int ));
void main01() { int(*pAdd)(int, int); pAdd = add; MyOP(pAdd); system("pause"); }
int MyOP(int(*myAdd)(int, int)) { add(10, 20); myAdd(1, 2); return 0; }
typedef int(*pFunc)(int, int); int MyOP02(pFunc p) { add(10, 20); p(3, 2); return 0; }
void main() { int(*pAdd)(int, int); pAdd = add; MyOP02(pAdd); system("pause"); }
|
模板
泛型编程基础
模板是创建泛型类或函数的蓝图或公式。库容器:比如迭代器,都是泛型编程的例子,他们都使用类模板的概念, 每个容器都有一个单一的定义,比如向量,我们可以定义许多不同类型的向量,比如vector 或 vector 。
模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include <iostream> using namespace std;
template<typename T> void myswap3(T &a, T &b) { T t = a; a = b; b = t; } void main() { int x = 1; int y = 2; myswap3(x, y); printf("x = %d y = %d\n", x, y); char a = 'A'; char b = 'B'; myswap3<char>(a, b); printf("a = %c b = %c\n", a, b); system("pause"); }
|
函数模板增强
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include <iostream> using namespace std;
template<typename T> int Print(T *p, int num) { for (int i = 0; i < num; i++) { cout << p[i] << endl; } return 0; } template<typename T> int SortArray(T *p, int num) { int temp; for (size_t i = 0; i < num; i++) { for (size_t j = i + 1; j < num; j++) { if (p[i] > p[j]) { temp = p[i]; p[i] = p[j]; p[j] = temp; } }
} return 0; }
template<typename T1,typename T2> int SortArray02(T1 *p, T2 num) { T1 temp; for (size_t i = 0; i < num; i++) { for (size_t j = i + 1; j < num; j++) { if (p[i] > p[j]) { temp = p[i]; p[i] = p[j]; p[j] = temp; } }
} return 0; }
void main() {
int num = 10; char b[] = "sdasghadghadhdasdfasdasdasd"; int num1 = strlen(b) - 1; SortArray02<char, int>(b, num); Print<char>(b, num); system("pause"); }
|
函数模板遇上函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream> using namespace std;
template <typename T> T max(T a, T b) { return a > b ? a : b; }
void func1(int i, char c) { max(i, i); max(c, c);
}
template <typename T1, typename T2> T1 max(T1 a, T2 b) { return a > b ? a : b; }
void func(int i, char c) { int q; max(i, i); max(c, c); q = max<int ,char>(i, c); printf("q = %d\n", q); c = max<char,int >(c, i);
}
void main() { func(10, 'c'); system("pause"); }
|
函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <iostream> using namespace std;
template <typename T> int mySwap(T &a, T &b) { T c ; c = a; a = b; b = c; return 0; }
void mySwap(int &a, char &b) { ; }
void main() { int c = 20; int a = 10; char b = 'b'; mySwap(c, b); system("pause"); }
|
重载函数模板
- 寻找和使用最符合函数名和参数类型的函数,若找到则调用;
泛型编程类模板