想了很久,我应该为C++写些什么了。
应该在去年,在Joe(http://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++ Connections在Las Vegas召开了年会。与会人员的讨论内容,也或多或少的反映了C++未来发展的方向。网页上这么一段话甚是值得反思:这次会议大部分内容都是在介绍STL和Generic 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++程序设计分为四个等级:
1、C. 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。在那个时代,这是一个了不起的创造,因为OOP和C的结合,创造了C++辉煌的历史。在那个年代,OO意味着先进的思想。
但是,C++也在随着时代而改变。现在,OO已经无处不在地渗入了软件设计中,它以不在只是C++的专利了。当然,C++也没有因为过去创造的辉煌而停滞不前。Matt Austern等先驱们将Generic Programming与C++结合,带来了全新的STL。这是一个全新的概念,一个伟大的创举。STL的出现,带来了全新的编程理念,也带来了全新的编程体验。
还是通过一些代码来说明吧:
假设又一个很简单的需求:一次输出从0到9这10个数字,要求以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.1(Visual Studio .NET 2003的一个组件)。这也给Windows平台的C++开发带来了新的希望。我不想多说了,只有一个建议,忘记VC6.0吧,那已经是历史了。(如果你只是想学习MFC的话,VC6还是一个不错的选择,特别是其中的Class Wizard。相比之下,VC7.1的Class Wizard就要逊色多了。不过这也反映了一个方向,Microsoft在减少对于MFC的支持。也许过不了太久,MFC都将成为历史。)
2、学习标准。真的,标准中有很多东西需要我们去细细揣摸。熟悉C++98(包括后来更新的C++03标准),才能说是真正熟悉了C++。当然,标准中的STL也是非常值得去学习的,熟练掌握了它,你才能说是到了C++的最高层次。另外,SGI(www.sgi.com/tech/stl/)上也提供了一个扩展的STL库,其中包括详细的文档。还要补充一点,就是Boost(http://www.boost.org/)。如果你现在还不知道boost是什么的话,现在是时候去看看了。boost中提供了丰富的C++库实现,可以帮助你写出更好、更高效的代码。更重要的是,这些都是免费的,也是开源的,你可以随时获得它。要知道,boost中的一些库极有可能入选C++0x标准。如果想先熟悉C++0x的话,你也该去看看,了解C++大师们怎样写代码的。还有,一些好书也是必不可少的。Scott Meyers的Effective系列,Herb Sutter的Exceptional系列,还有Bjarne Stroustrup的The C++ programming language都是值得一看的,也是经得起时间考验的。
写了这么多,我只是想说明一点:C++在发展,我们也需要发展。也许,.NET, Java是现在流行的开发语言,但是C++同样也有它存在和发展的空间。要知道,.NET, Java也是从C++中吸取精华才发展起来的。C++,永远有它自己的优势。这是C++程序员应该看到的,也是应该感到欣慰的。
展望C++0x,未来一片美好~
分享到:
相关推荐
C++ 0x 新特性。并非全部,但包含了最重要的语言核心变化,主要缺少并发编程支持。
本书1000余页,是到现在为止对C++0x中新增特性的3大类别(即并发性(Concurrency)、库和语言)最权威,最详细的书籍,来源于C++之父网站,应该是C++之父《The C++ Programming Language》for C++0x第四版的一个雏形...
c++0x, c++11的解决办法 如果你是用makefile编译还好解决些,但是如果你是用CMake编译,你还得变成CMake的写法. 不过低层原理都一样,都是在g++上作文章. 我来告诉你makefile和CMakeLits.txt中怎么写来解决c++0x, c++11
C++ 0x FAQ 翻译版。C++0x - the next ISO C++ standard,讲述C++ 0x标准的新内容
Overview of the New C++ C++0x Scott Meyers
C++0x 标准草稿。 C++0x 标准草稿。 C++0x 标准草稿。 C++0x 标准草稿。
C++最新标准!Overview of the New C++ (C++0x)
VC10中的C++0x特性
c++0x 线程 并行 最新资料 非常有用
C++0x标准的草案,估计改动不会太大,英文好的可看看。
C++0x_新特性
Scott Meyers 的关于C++0x的overview Effective C++ 作者的最新书籍
本人收集的,C++0x新标准资料,非常适合C++爱好者!
C++0x完成最终草案国际标准(FDIS)