(轉貼) Javaer 双修C++的key point (C/C++) (Java)
作者:江南白衣
关键是把C++当作Java的sister,无关C事。
所以不要买〈C/C++.....〉为名的书,入门推荐〈Essential C++〉的中文版之类,开篇就讲C++/STL。
如果不幸学校里已经学了C,想办法忘掉它。
1. 用STL的 string ,不用char* 和strcpy()
辅以Boost的Tokenizer实现Java的Tokenizer
conversion/lexcial_cast实现字符串<->数值转换。
Regex实现正则表达式。
#include
{
string str="haha,hehe";
tokenizer<> tok(str);
for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg)
{
cout << *beg << endl;
}
string s = lexical_cast<string>(123);
}
需要调用C API时,const char* cs = str.c_str() 转换。
2. 用STL的vector,不用 C式的array
vector在STL容器里也是首选的容器。
如果需要批量给vector赋初始值时,使用Boost的Assign.
如果容器内需要装载多种数据类型,使用Boost的Any.
#include <boost/assign.hpp>
void main()
{
vector<any> vec;
vec+=1,"hello";
}
需要调用C API时,&vec[0] 指向第一个元素
3.用Boost 的smart pointer,尽量少用普通指针
统一使用Boost的shared_ptr,解决诸如两个对象同时拥有第3个对象,异常处理和忘记delete的问题。当然,如果refrence可用的时候,就连指针都不要用了,可怜java下用惯了new。
4.使用STL 异常机制,不用C式的Return Error Code 机制
抛出标准的exception ,不要抛int,string等,一如Java。
何时用返回值,何时用Excetpion的判断,亦一如Java。
{
throw exception("error");
}
catch (exception e)
{
cout<<e.what()<<endl;
}
5. Keep it simple
不使用C式的特性如#define。
尽量不要运算符重载。
为了整个团队和日后的维护,更加尽量不用Template、STL、Boost 中复杂陌生的东西,如type traits, Typelist, mpl,lambda,bind....
STL 似乎是个分水岭,从此C++ 不断的向学院派,复杂化发展--TR1、TR2到0x。而Java,C#们则始终保留基本语言的特征,通过不断的制定更多实用的类库、规范,抢占越来越多的市场。
6. 必备读物
2006年入行的C++程序员是幸福的,因为又多了两本实用读物的中文版,〈C++必知必会C++ Common Knowledge )〉和两位老怪返璞归真之作〈C++ Coding Standard〉,两本都是2005年新鲜写好的书,可以用来淘汰掉上一代的一大堆所谓必备书籍。
7. 益智读物
某人说过,决定学一门新语言,需其能给自己的思维模式带来冲击。
所以,推荐下面三本能带来冲击的益智读物:
〈Modern C++ Design - Generic Programming and Design Patterns 〉
〈C++ Templates - The Complete Guide〉
〈C++ Template Metaprogramming Concepts,Tools and Techniques from Boost and Beyond 〉
上面的书虽然不赞成其复杂性而限制在大团队中运用,但对个人智力来讲就大有裨益,比那些在语言规范、编译器下绕来绕去的Effective系列Exceptional系列有趣得多。