`
foremire
  • 浏览: 16244 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C++0x展望

阅读更多

想了很久,我应该为C++写些什么了。

应该在去年,在Joehttp://joehust.yculblog.com/)的Blog上看到关于C++0x的一些信息,于是上网查了一下。这应该要从Bjarne Stroustrup在2005年11月19-21日在上海举行的“Modern C++ Design &Programming”技术大会上的主题发言“Direction for C++0x”说起了。C++0x,已经被广大程序员期盼已久;在程序设计语言百花齐放的年代,我们希望看到更加有活力的C++,期待C++能以崭新的姿态迎接时代的挑战。在Bjarne Stroustrup的报告中,提到C++未来的发展的两个目标:

1、使C++成为一门更好的系统变成语言和构建库的语言;

2、使C++更易于教和学;

同时,标准委员会ISO C++委员会也提出了一些关于改进标准的方针。其中,最具吸引力的,包括将来既有可能支持可选的垃圾收集机制,并将以一个及其模型外加支持县城的标准库设施,并支持并发编程。

……

 

前不久,在看《Effective STL》的电子版时,发现了一个链接。结果,又了解到一些新的信息。C++ ConnectionsLas Vegas召开了年会。与会人员的讨论内容,也或多或少的反映了C++未来发展的方向。网页上这么一段话甚是值得反思:这次会议大部分内容都是在介绍STLGeneric Programming,以往很火的OOP内容已经少之又少。如果你看不懂这种风格的代码:

tr1::function < void(const record_set&) >  on_completion =tr1::bind(tr1::mem_fn(&grid::display_data), this, _1),

你可能快落伍了!

…...

看了很多,也有很多感想。也许,我们真的该期待C++0x,期待C++的未来。但是,我们也应该看看,面对发展中的C++ 我们应该做些什么?

 

也许,正如上面所述,如果你无法看懂那段代码,你应该怀疑你是否真的落伍了。

记得Scott Meyers在他的大作《Effective C++》中,提到了C++程序设计分为四个等级:

1C.        Way down deep, C++ is still based on C. Blocks, statements, the preprocessor, built-in data types, arrays, pointers, etc., all come from C;

2、Object-Oriented C++. This part of C++ is what C with Classes was all about: classes (including constructors and destructors), encapsulation, inheritance, polymorphism, virtual functions (dynamic binding), etc.

3、Template C++. This is the generic programming part of C++, the one that most programmers have the least experience with.

4、The STL. The STL is a template library, of course, but it's a very special template library. Its conventions regarding containers, iterators, algorithms, and function objects mesh beautifully, but templates and libraries can be built around other ideas, too.

正如很多武侠小说中提到的,一般上层武功分为好几层,修炼者必须勤加修炼,逐级渐进,才能练到最上层,成就绝世武功。Scott Meyers也中肯地将C++ Programming分为这么四级。我想,看到这篇文章后,应该想想自己现在已经修炼到哪一层了。

 

还是先看看C++的历史吧。当初Bjarne Stroustrup发明C++时,对C++一词的解释是借用了C中的一个有趣的运算符;其本意,就是对C的一种改进。按照当时更加确切的说法,C++就是指C With Class。在那个时代,这是一个了不起的创造,因为OOPC的结合,创造了C++辉煌的历史。在那个年代,OO意味着先进的思想。

但是,C++也在随着时代而改变。现在,OO已经无处不在地渗入了软件设计中,它以不在只是C++的专利了。当然,C++也没有因为过去创造的辉煌而停滞不前。Matt Austern等先驱们将Generic ProgrammingC++结合,带来了全新的STL。这是一个全新的概念,一个伟大的创举。STL的出现,带来了全新的编程理念,也带来了全新的编程体验。

 

还是通过一些代码来说明吧:

假设又一个很简单的需求:一次输出从0910个数字,要求以tab间隔;

首先看看 C++的普通实现吧:

Solution A

...

    int intArray[10];

    for (int i = 0; i < 10; ++i)

    {

        intArray[i] = i;

    }

 

    std::cout << "Now the 10 value in the Array is:" << std::endl;

    for (int i = 0; i < 10; ++i)

    {

        std::cout << intArray[i] << "\t";

    }

    std::cout << "\nEnd of Output!" << std::endl;

    std::cin.get();

……

 

好了,也许有些人会说,为什么不能更先进一点呢,采用class来实现。好吧,那就用std::vector吧。

Solution B

...

    std::vector<int> intVec2;;</int>

    for (int i = 0; i < 10; ++i)

    {

        intVec2.push_back(i);

    }

 

    std::cout << "Now the 10 value in the Vecotr-like Array is:" << std::endl;

    for (int i = 0; i < 10; ++i)

    {

        std::cout << intVec2[i] << "\t";

    }

    std::cout << "\nEnd of Output!" << std::endl;

    std::cin.get();

...

这样好了吧,我们还可以在运行时动态增加intVec2的长度,而不用担心内存情况。把这些事情交给std::vector吧。这样也算generic吧。

再看看STL是怎么实现的吧:

……

Solution C

class SetAdapter : public std::unary_functionvoid>

{

public:

    SetAdapter(const int val)

        : initialValue_(val)

    {

    }

 

    result_type operator()(argument_type & val)

    {

        val = initialValue_ ++;

    }

private:

    int initialValue_;              //!< Initial Value for Set the value of the vector

};

 

int main()

{

         std::vector<int> intVec(10);</int>

    std::for_each(intVec.begin(), intVec.end(), SetAdapter(0));

 

    std::cout << "Now the 10 value in the Vector is:" << std::endl;

    std::copy(intVec.begin(), intVec.end(), std::ostream_iterator<int>(std::cout, "\t"));</int>

    std::cout << "End of Output!" << std::endl;

 

    std::cin.get();

         return 0;

}

……

这就是STL…

这只是一个很简单的例子,也许并不能说明太多问题。也许你会认为,STL并没有改变什么,Solution C的代码量还是最多的呢。如果这样的话,我无话可说。如果这个需求再复杂一点,数据量再大一点(1000,10000,100000, even more...),我想你就能看到差距了。

STL带来的,不仅仅是效率的问题。代码风格,算法,扩展,维护,还有很多很多,都可以因为STL而变得如此简单。

 

What to do:

面对即将到来的C++0x,我们应该改变些什么,也应该悟出些什么:

1、尊重标准。这个问题牵涉到开发平台的问题。在某种程度上,开发人员对于标准,对于语言的认识,是建立在开发平台上的。这是一个无法回避的问题,标准只是纸上的东西,写出代码,编译运行才是最终的目标。在Windows平台上,用的最多的,就是Visual C++了。但是遗憾的是,至今,我还看到又一部分人坚持奋斗在VC6.0上。是的,VC6.0曾经创造了很多辉煌,我也是从VC6.0开始接触C++的。但是,我们应该看到,那已经是9年前的东西了,在IT日新月异发展的今天,9年前的东西也该算得上老古董了。我不是因为喜新厌旧才抛弃VC6的。这是一个标准的问题。VC6出现的年代,C++98标准还没有问世,当然就不可能谈得上对于现代C++的支持。事实上,VC6.0(及其以前版本)只是Microsoft开发工具中的C++实现而已。其中的标准,大部分都是Microsoft为了更好地支持平台开发,而人为地设定。就因为这样,VC6也遭到了业内认识的批评。Scott Meyers在他的《C++5x5断想》中痛心地谈到,那个时代的绝大部分VC6.0的开发人员(尤其是MFC开发人员)既然认为VC6(MFC)就是C++标准。这是一个痛心的现实,我们无法回避。但是,2003年,Microsoft终于改过自新了,推出了全面支持C++98标准的VC7.1Visual Studio .NET 2003的一个组件)。这也给Windows平台的C++开发带来了新的希望。我不想多说了,只有一个建议,忘记VC6.0吧,那已经是历史了。(如果你只是想学习MFC的话,VC6还是一个不错的选择,特别是其中的Class Wizard。相比之下,VC7.1Class Wizard就要逊色多了。不过这也反映了一个方向,Microsoft在减少对于MFC的支持。也许过不了太久,MFC都将成为历史。)

2、学习标准。真的,标准中有很多东西需要我们去细细揣摸。熟悉C++98(包括后来更新的C++03标准),才能说是真正熟悉了C++。当然,标准中的STL也是非常值得去学习的,熟练掌握了它,你才能说是到了C++的最高层次。另外,SGIwww.sgi.com/tech/stl/)上也提供了一个扩展的STL库,其中包括详细的文档。还要补充一点,就是Boosthttp://www.boost.org/)。如果你现在还不知道boost是什么的话,现在是时候去看看了。boost中提供了丰富的C++库实现,可以帮助你写出更好、更高效的代码。更重要的是,这些都是免费的,也是开源的,你可以随时获得它。要知道,boost中的一些库极有可能入选C++0x标准。如果想先熟悉C++0x的话,你也该去看看,了解C++大师们怎样写代码的。还有,一些好书也是必不可少的。Scott MeyersEffective系列,Herb SutterExceptional系列,还有Bjarne Stroustrup的The C++ programming language都是值得一看的,也是经得起时间考验的。

 

写了这么多,我只是想说明一点:C++在发展,我们也需要发展。也许,.NET, Java是现在流行的开发语言,但是C++同样也有它存在和发展的空间。要知道,.NET, Java也是从C++中吸取精华才发展起来的。C++,永远有它自己的优势。这是C++程序员应该看到的,也是应该感到欣慰的。

展望C++0x,未来一片美好~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics