寒假这些天在看《The C++ Programming Language, 3rd》。
今天看到Chapter7 Function,里头好一些东西是C语言里没有的,比如overload、passing by reference。这里不讲这些,讲C语言也有的 pointer to function。以前学C语言的时候,简单学过pointer to function,还在大一用过那么一会。当时是在MCS-51上的delay函数,因为发现while语句与for语句在相同参数下花费时间不一样,写了一个小程序验证强化对比我的直观感受。代码如下:
1 #include <reg51.h> 2 3 sbit beep = P2^3; 4 5 void delayms_v1(unsigned int); 6 void delayms_v2(unsigned int); 7 void delayms_v3(unsigned int); 8 void delayms_v4(unsigned int); 9 10 // void leftmove(); 11 // void leftmove_one(); 12 void leftmove_one_test(); 13 14 void main() 15 { 16 leftmove_one_test(); 17 18 } 19 20 // void leftmove() 21 // { 22 // P1 = 0xFE; 23 // while (1) 24 // if (P1 == 0) { 25 // P1 = 0xFF; 26 // delayms_v1(500); 27 // } else { 28 // P1 = P1 << 1; 29 // delayms_v1(500); 30 // } 31 // } 32 33 void leftmove_one_test() 34 { 35 unsigned char apoint, pos, i; 36 void (*delay_funcs[4])(unsigned int) = {delayms_v2, delayms_v3, delayms_v4, delayms_v1 }; 37 38 for (i = 0; i < 4; i++) { 39 apoint = 1; 40 for (pos = 0; pos < 8; pos++) { 41 P1 = ~apoint; 42 beep = 0; 43 (*delay_funcs[i])(10); 44 beep = 1; 45 apoint = apoint << 1; 46 (*delay_funcs[i])(500); 47 } 48 } 49 } 50 /* 51 void leftmove_one() 52 { 53 unsigned char apoint = 1; 54 while (1) 55 if (apoint == 0) 56 apoint = 1; 57 else { 58 P1 = ~apoint; 59 beep = 0; 60 delayms_v3(10); 61 beep = 1; 62 apoint = apoint << 1; 63 delayms_v3(480); 64 } 65 } */ 66 void delayms_v1(unsigned int time) 67 { 68 unsigned char i = 110; 69 while (time--) 70 while (i--); 71 } 72 void delayms_v2(unsigned int time) 73 { 74 unsigned char i; 75 while (time--) 76 for (i = 0; i < 110; i++); 77 } 78 void delayms_v3(unsigned int time) 79 { 80 unsigned char i, j; 81 for (i = time; i > 0; i--) //为什么不可以写成 for (i = 0; i < time; i++) ??? 82 //for (i = 0; i < time; i++) 83 for (j = 0; j < 110; j++); 84 } 85 void delayms_v4(unsigned int time) 86 { 87 unsigned char i = 0; 88 while (time--) 89 for (i; i < 110; i++); 90 }
以上代码有严重bug,当时怎么也想不明白,现在一眼看得出。不过我还是不想改,就这样原封不动贴出来比较好。
言归正传,看完bj大大的文字与代码,确实感触良多。这里只讲其中一小点(一个Chapter里的一个section里的一小点:-) )。
这里用这章的exercise 1做展开(其实只是我做这道题遇到一些bj大说的silly mistakes,想记录而已,哈哈)。
这道题要我写几个declarations,第一个:a function taking arugments of type pointer to character and reference to integer and returning no value.
这个好办。
1 void f1(char*, int&);
第二个:a pointer to such a function.
这个也好办。
void (*pf1)(char*, int&);
第三个:a function taking such a pointer as an argument.
这个我真想了挺久的(这就是我写这篇博客的最初动机)。后来看到题目后面的hint:Use typedef 才恍然大悟。连同第四个:a function returning such a pointer。这四个declaration如下:
typedef void FUNC(char*, int&); FUNC f1; FUNC (*pf1); void f2(FUNC*); FUNC* f3();
本着人道主义精神,我还是把整个文件贴出来吧...
1 #include <iostream> 2 #include <string> 3 #include <typeinfo> 4 using namespace std; 5 6 typedef void FUNC(char*, int&); 7 FUNC f1; 8 FUNC (*pf1); 9 void f2(FUNC*); 10 FUNC* f3(); 11 12 int main() 13 { 14 char str[] = "hello"; 15 int i = 2; 16 f1(str, i); 17 pf1 = f3(); 18 pf1(str, i); 19 f2(f1); 20 21 return 0; 22 } 23 24 void f1(char* st, int& it) 25 { 26 cout << "type of " << st << " is " << typeid(st).name() << endl; 27 cout << "type of " << it << " is " << typeid(it).name() << endl; 28 } 29 30 void f2(FUNC* foo) 31 { 32 char xi[] = "xixi"; 33 int haha = 3; 34 foo(xi, haha); 35 } 36 37 FUNC* f3() 38 { 39 return f1; 40 }
原文:http://www.cnblogs.com/numbaa/p/5188293.html