想了很久,我应该为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标准的影响与未来展望 C++0x(C++11)的推出极大地推动了C++的发展,使其成为了更加现代化的语言。通过引入多线程支持、智能指针等特性,C++变得更加高效和易于使用。此外,C++0x还为后续版本如C++14...
- **C++0x的由来**:C++0x是C++11的早期代号,指的是2011年发布的C++标准。 - **目标与背景**:C++0x的目标在于提升语言的安全性、效率和易用性。新版本的推出旨在解决C++98和C++03中存在的问题,并吸收其他现代编程...
- **第12章:C++0x**(第515页开始)展望了C++标准的发展趋势,特别是C++0x(现为C++11)带来的新特性和改进,这些特性对元编程有着重大影响。 #### 总结 《高级元编程在经典C++ [2015]》不仅是一本技术书籍,它还...
通过引入诸如低开销的抽象、资源管理机制以及面向未来的特性(如C++0x中的改进),C++为系统编程提供了一个坚实的基石。未来,C++将继续在其核心优势上进行改进,以更好地支持复杂系统的开发,同时也将致力于提高...
此外,可能还会讨论即将发布的C++0x(后来的C++11),其引入的新特性如RAII(Resource Acquisition Is Initialization)、智能指针、lambda表达式和右值引用等。 3. **设计模式和最佳实践**:在C++会议中,设计模式...
- **语法支持**: 新版本中加入了对 C++0x 标准的支持,包括自动类型推导、右值引用等特性,极大地简化了代码编写流程。 - **多线程支持**: Visual C++ 2010 加强了对多线程编程的支持,提供了更高级的并发编程工具,...
C++标准委员会的目标是在C++0X版本中提供正确的线程支持,这里X的目标值为9,但实际情况可能会达到0xA。这一版本中包括了以下内容: - **内存模型**:定义了线程可见的共享变量值,这对于理解线程间的同步机制至关...
其中,文件头包含GIF文件的签名和版本号,数据流则由控制标识符、图像块和其他可选的扩展块组成,最后以一个分号(0x3B)作为文件尾,表示文件的结束。 GIF文件内部按块进行划分,包括控制块和数据块。控制块负责...
2. **重要版本更新**:书中详细记录了GCC各个重要版本的特点和发展方向,如GCC 4.0引入的C++0x支持、GCC 5.0对C++14标准的支持等。 #### 三、GCC的核心组件 GCC不仅仅是一个C语言编译器,它还包括了一系列的工具和...
- **前置知识**:读者需具备ARM指令集、ARM汇编语言、C/C++编程的基础知识,以及对ARM流水线结构有一定的理解。 - **工具需求**:推荐使用ARM Developer Suite (ADS) 1.2或更高版本进行编程。了解编译器、链接器和...
- **多语言接口**:支持多种编程语言,如Java、Python、C++等,以满足不同开发环境的需求。 - **文档完善**:详尽的API参考文档和开发者指南,便于理解和使用。 - **示例代码**:提供丰富的示例代码,帮助快速...