`

Javaer 双修C++的key point

阅读更多
转:
作者:江南白衣
http://www.blogjava.net/calvin/archive/2005/10/10/15132.html

    关键是把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系列有趣得多。
   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics