xwz 2010-10-31

798 views

Published on

编程那些事

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
798
On SlideShare
0
From Embeds
0
Number of Embeds
100
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

xwz 2010-10-31

  1. 1. 编程那些事儿
  2. 2. 练武不练功,到老一场空!
  3. 3.  内功:  数据结构,算法,架构,设 计模式,组成原理,操作 系统,计算机网络,基本 数学和计算机知识……  武功秘籍:  一个好的创意!!!  修炼 == 学习  实战 == 项目  兵器:  编程语言如C++,Java 等  C++基本功:  C++语法,C++编程技 巧
  4. 4. C++语法篇(1)- explicit  explicit 显示调用构造函数,单参数构造函数使用  class String  { ◦ explicit String(int size); ◦ String(const char*p); }; String s1 = ‘a’; //不可以 String s2(10); //OK String s3 = “abc”; //期待的形式
  5. 5. C++语法篇(1)- explicit  class IntChildClassrray{  public: ◦ IntChildClassrray(int size); }; IntChildClassrray a(10); IntChildClassrray b(10); for(int i=0; i<10; ++i) if(a==b[i]) //What happened? ……
  6. 6. C++语法篇(2)-成也寄存器 败也寄存器  register 建议编译器放进寄存器(频繁访问指针)  volatile 别放进寄存器(for循环中的计数器i)  程序优化optimization编译参数  MSVC /Od /O1 /O2 /Ox  GNU –O1 –O2 –O3
  7. 7. C++语法篇(3)-强制类型转换  static_cast  就咱这编译器,基本告别C模式转换  double d=50.0;  int i = (int)d; //在C++中过时了  int i = static_cast<int>(d);//More safe  const_cast  去掉const和volatile属性,除非万不得已,不然还是远离它  void f(const TypeChildClass* a)  { ◦ TypeChildClass* b=a; //Error ◦ TypeChildClass* b=const_cast<TypeChildClass*>(a); //终 于编译过了,最好不要这么做,如果你像更改,直接定义成非const的最 好  }
  8. 8. C++语法篇(3)-强制类型转换  dynamic_cast  多态必备,运行时检查,主要用于基类向派生类转换.  class ChildClass:public BaseClass{};  BaseClass* ptr;  ChildClass* a = dynamic_cast<ChildClass*>(ptr); //可以,More safe  ChildClass* a = static_cast<ChildClass*>(ptr); //可以,More speed  class ChildClass:virtual public BaseClass{};  BaseClass* ptr;  ChildClass* a = dynamic_cast<ChildClass*>(ptr); //可以  ChildClass* a = static_cast<ChildClass*>(ptr); //不可以  void *ptr;  MyClass* a = dynamic_cast<MyClass*>(ptr);//不可以  a = static_cast<MyClass*>(ptr); //可以,但是后果不堪设想
  9. 9. C++语法篇(3)-强制类型转换  reinterpret_cast  负责把一个void*或者纯地址转换为所需类型  void *v;  TypeA *a=reinterpret<TypeA*>(v);  TypeA *a=reinterpret<TypeA*>(0x00ff);  int cache();  安全隐患  忠告:  第一.四种转换都是模板函数别忘了尖括号+括号  第二.尽量避免C模式的转换改用C++模式的强制类型转换  第三.const_cast和reinterpret_cast安全隐患比较大,尽量少 用.
  10. 10. C++语法篇(4)-符号重载  符号重载:今天的牺牲是为了换来明天的解放  *(指针),->,[],++,--等符号在STL的容器当中 有大量的使用.  这里讲两种比较容易忽略的地方++i和i++操作 符和二元操作符的一个小细节(见operator.cpp)  auto_ptr就是用到了*和->的重载来实现的,可 以很好的控制指针的申请和释放.
  11. 11. C++语法篇(5)-&符号几时用?  &引用符号什么时候用,这里主要讲一下传参和返回什么时候用.两种都是可 用可不用的,但是用了可以提高效率.  1.作为参数  首先是值传递,自定义类型最好用,默认类型可用可不用.不加引用符号,不会 出现错误,但是加了会提高效率.而默认类型加和不加效果并没有自定义类型 明显.  void f(const Type1 &,const int &);  void f(const Type2 &,const int);  2.作为返回类型  指针取值的都可以加.  int f(){int value=0;return value;}  int *value;  int &f(){*value=0;return *value;}  最为常见:  TypeA &TypeA::f(){return *this;}
  12. 12. C++语法篇(6)-访问权限知多少  protected类型:子类可以访问.  class A  {  public:  inline void g(A &a)  {  value = a.value;  }  protected:  int value;  };
  13. 13. C++语法篇(6)-访问权限知多少  class B:public A  {  public:  inline void f()  {  value = a.value;  }  inline void h(A &c)  {  value = c.value;  }  private:  A a;  };
  14. 14. C++应用篇(1)-模板的应用  模板类和函数的定义,用处不大,编程使用较少  模板类和函数的调用却处处可见:STL,boost  STL应用的建议(PC机上肯定试用,嵌入式选择性借鉴):  1.尽量使用模板,如:变长数组,排序,搜索,!!!字符串类型String.抛开任何内存和效率的顾虑 放心大胆的使用STL吧.  2.尽量不要尝试性在工程中使用自己实现的类STL库,你不会比STL写的更完美,更安全,更高 效.  3.sgi版本的模板跨平台性更强,实现更为广泛.  4.仿函数在模板中应用很广( 应用(3) ).  5.list<int>和list<double>完全是两个豪不相关的类,非继承关系,模板工作于编译阶段效 率很高.  6.struct Token{char*;enum}  用map吧!  7.迭代器中 <containter.end() 和 !=containter.end()不一样,一定要用后者!  8.当返回值为两个时, 还在使用A f(B*);吗,看来你OUT了,现在流行 pair<A,B> f();  9.++i效率高于i++, x+=y效率高于x=x+y(相差不多无关紧要)  10.STL的作用域都是std,在工程中尽量不要用using namespace std;会产生命名空间冲 突,可以用using std::cout; using std::cin;
  15. 15. C++应用篇(2)-C方法 vs C++方法  PC机平台强烈建议(嵌入式平台选择性建议):  1.尽量使用C++的new 和delete替代malloc和free,如果你 想用realloc可能vect更适合你.  2.多用流控制吧,比如cout替代printf,cin替代scanf,fstream 替代fopen.使用方便,并且方便和STL结合.  3.尝试用cstdio代替stdio.h,cstdlib代替stdlib.h还有其它的C 标准库也是.在C++中,类内部使用全局函数需要加上,比 如::fopen,::fwrite(与编译器相关).  4.inline,enum和const代替宏,仿函数代替指向函数的指针.  5.C++ lib不是万能的,但是C++却可以让我们不付出任何代 价的调用C lib,不用白不用.      6.不要去担心语言差异的效率问题,C只比C++快那么一点点. 而使用得当的面向对象可以把你的编程效率提高好几倍,好的 框架也可以为今后的扩展和维护省下一大笔人力,资金和时间.
  16. 16. C++应用篇(3)-仿函数  仿函数:顾名思义仿制的函数,不是真正意义上的 函数,它实际是一个括号操作符的重载.  举例:比如排序函数的比较方法(见functor.cpp)
  17. 17. C++应用篇(4)-循环只做它该做的  老祝语:万恶的strlen,可恶的for循环.  for( ; ; )  { ◦ a[i] = strlen(str) + i;  }  int len = strlen(str);  for( ; ; )  { ◦ a[i] = len + i;  }  万恶的临时变量:  for( ; ; )  { ◦ int temp = 0; //我不属于这里,放到for循环之外 ◦ temp = a[i]; ◦ a[i]= b[i]; ◦ b[i] = temp;  }
  18. 18. C++应用篇(5)-Qt and MFC are C++  无论是Qt还是MFC,你首先要记住它先是C++,然后 才是Qt或者MFC.所以你必须遵守C++的一切规则.  无论用Qt还是MFC亦或是别的GUI库,STL可以 用,C++的一切语法和特性在这都可以用.立足于我在 写的是C++程序,调用了Qt或者MFC类库.  当Qt或者是MFC库中没有你想要的东西的时候,记得 回归C++思想去解决问题,写lib的人也不可能面面俱 到.它没办法把每一个人的需求全部考虑到.而且C++ 的开源库都是可以用进来帮助你解决问题的.  一个”Qt的Assistant”引发的血案!
  19. 19. 面向对象的精髓-设计模式  面向对象并不一定能够提高运行效率,效率主要是 和算法挂钩.  C是一种”尽可能接近机器”的语言,C++是一种” 尽可能接近需要解决的问题”的语言  Bjarne Stroustrup  方便灵活的接口和合理设计模式才是C++的优点  设计模式是伪科学?? 23种Only?? 束缚编程人员的 创造能力??
  20. 20. 参考书籍  C++程序设计语言  C++沉思录  Effective C++  More Effective C++  C++标准程序库  STL源码剖析
  21. 21. 首先感谢党和祖国 还要感谢CCTV,MTV和各种TV

×