xwz 2010-10-31

21
编程那些事儿

Upload: carlxwz

Post on 11-Jul-2015

381 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: xwz 2010-10-31

编程那些事儿

Page 2: xwz 2010-10-31

练武不练功,到老一场空!

Page 3: xwz 2010-10-31

内功:

数据结构,算法,架构,设计模式,组成原理,操作系统,计算机网络,基本数学和计算机知识……

武功秘籍:

一个好的创意!!!

修炼 == 学习 实战 == 项目

兵器:

编程语言如C++,Java等

C++基本功:

C++语法,C++编程技巧

Page 4: xwz 2010-10-31

C++语法篇(1)- explicit

explicit 显示调用构造函数,单参数构造函数使用

class String

{◦ explicit String(int size);

◦ String(const char*p);

};

String s1 = ‘a’; //不可以

String s2(10); //OK

String s3 = “abc”; //期待的形式

Page 5: xwz 2010-10-31

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?

……

Page 6: xwz 2010-10-31

C++语法篇(2)-成也寄存器 败也寄存器

register 建议编译器放进寄存器(频繁访问指针)

volatile 别放进寄存器(for循环中的计数器i)

程序优化optimization编译参数

MSVC /Od /O1 /O2 /Ox

GNU –O1 –O2 –O3

Page 7: xwz 2010-10-31

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的最好

}

Page 8: xwz 2010-10-31

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); //可以,但是后果不堪设想

Page 9: xwz 2010-10-31

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安全隐患比较大,尽量少用.

Page 10: xwz 2010-10-31

C++语法篇(4)-符号重载

符号重载:今天的牺牲是为了换来明天的解放 *(指针),->,[],++,--等符号在STL的容器当中有大量的使用.

这里讲两种比较容易忽略的地方++i和i++操作符和二元操作符的一个小细节(见operator.cpp)

auto_ptr就是用到了*和->的重载来实现的,可以很好的控制指针的申请和释放.

Page 11: xwz 2010-10-31

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;}

Page 12: xwz 2010-10-31

C++语法篇(6)-访问权限知多少

protected类型:子类可以访问. class A { public: inline void g(A &a) { value = a.value; } protected: int value; };

Page 13: xwz 2010-10-31

C++语法篇(6)-访问权限知多少 class B:public A { public: inline void f() { value = a.value;

} inline void h(A &c) { value = c.value; } private: A a; };

Page 14: xwz 2010-10-31

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;

Page 15: xwz 2010-10-31

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++快那么一点点.而使用得当的面向对象可以把你的编程效率提高好几倍,好的框架也可以为今后的扩展和维护省下一大笔人力,资金和时间.

Page 16: xwz 2010-10-31

C++应用篇(3)-仿函数

仿函数:顾名思义仿制的函数,不是真正意义上的函数,它实际是一个括号操作符的重载.

举例:比如排序函数的比较方法(见functor.cpp)

Page 17: xwz 2010-10-31

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;

}

Page 18: xwz 2010-10-31

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”引发的血案!

Page 19: xwz 2010-10-31

面向对象的精髓-设计模式

面向对象并不一定能够提高运行效率,效率主要是和算法挂钩.

C是一种”尽可能接近机器”的语言,C++是一种”尽可能接近需要解决的问题”的语言

Bjarne Stroustrup

方便灵活的接口和合理设计模式才是C++的优点 设计模式是伪科学?? 23种Only?? 束缚编程人员的创造能力??

Page 20: xwz 2010-10-31

参考书籍

C++程序设计语言 C++沉思录

Effective C++

More Effective C++

C++标准程序库 STL源码剖析

Page 21: xwz 2010-10-31

首先感谢党和祖国还要感谢CCTV,MTV和各种TV