Javaer 雙修C++的key point
作者:江南白衣
關鍵是把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
#include
void main()
{
string str="haha,hehe";
tokenizer<> tok(str);
for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg)
{
cout << *beg << endl;
}
int i = lexical_cast<int>("123");
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/any.hpp>
#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。
shared_ptr<string> p2 ( new string("Use shared_ptr "));
4.使用STL 異常機制,不用C式的Return Error Code 機制
拋出標準的exception ,不要拋int,string等,一如Java。
何時用返回值,何時用Excetpion的判斷,亦一如Java。
try
{
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系列有趣得多。
No comments:
Post a Comment