以下为本条目单独的全文转换,请从本页面进行编辑:
字词转换是中文维基的一项自动转换,目的是通过计算机程序自动消除繁简、地区词等不同用字模式的差异,以达到阅读方便。
字词转换包括全局转换和手动转换,本说明所使用的标题转换和全文转换技术,都属于手动转换。
C++是一种使用非常广泛的计算机程序设计语言。C++是一种静态数据类型检查的,支持多范型的通用程序设计语言。它支持程序化程序设计、数据抽象化、面向对象程序设计、泛型程序设计等多种程序设计风格。
贝尔实验室的比雅尼·斯特劳斯特鲁普博士在20世纪80年代发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类别开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间(name space)逐渐纳入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 14882-1998。遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准。
另外,就目前学习C++而言,可以认为它是一门独立的语言;它并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合中,C++完全可以取代C语言。
C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
目录 |
Stroustrup工作起于1979年的C with Classes。这个构思起源于 Stroustrup 做博士论文时的一些程序撰写经验。他发现Simula具备很利于大型软件开发的特点,但Simula的执行速度太慢,无法对现实需求发挥功效;BCPL虽快得多,但它过于低阶的特性,使其不适于大型软件的开发。当Stroustrup开始在贝尔实验室工作时,他有分析UNIX内核关于分布式计算的问题。回想起他的博士论文经验,Stroustrup开始为C语言增强一些类似Simula的特点。之所以选择C,是因为它适于各种用途、快速和可移植性。除了C和Simula之外,同时也从其它语言中取得灵感,如ALGOL 68、Ada、CLU以及ML。刚开始时,类别、派生类、储存类型检查、内联和默认参数特性,都是通过Cfront引入C语言之中。1985年10月出现了第一个商业化发布。
1983年,C with Classes改命名为C++。加入了新的特性,其中包括虚疑函数、函数名和操作符重载、参考、常量、使用者可控制的自由空间储存区控制、改良的类型检查,以及新的双斜线(//)单行注解风格。1985年,发布第一版《C++程序设计语言》,提供一个重点的语言参考,至此还不是官方标准。1989年,发布了Release 2.0。引入了多重继承、抽象类别、静态成员函数、常量成员函数,以及成员保护。1990年,出版了The Annotated C++ Reference Manual。这本书后来成为标准化的基础。稍后还引入了模板、异常处理、命名空间、新的强制转型,以及布尔类型。
随着C++语言的演变,也逐渐演化出相应的标准程序库。最先加进C++标准函数库的是流式I/O程序库,其用以取代传统的C函数,如printf和scanf。随后所引入的程序库中最重要的便是标准模板库,简称STL。
多年后,一个联合的ANSI-ISO委员会于1998年对C++标准化(ISO/IEC 14882:1998)。在官方释出1998标准的若干年后,委员会处理缺陷报告,并于2003年发布一个C++标准的修正版本。2005年,一份名为Library Technical Report 1(简称TR1)的技术报告释出。虽然还不是官方标准的一部分,不过它所提供的几个扩展可望成为下一版C++标准的一部分。几乎所有目前仍在维护的C++编译器皆已支持TR1。
虽然C++免专利,但标准文件本身并不是免费的。
C++这个名字是Rick Mascitti于1983年中所建议的,并于1983年12月首次使用。更早以前,尚在研究阶段的发展中语言曾被称为“new C”,之后是“C with Classes”。在计算机科学中,C++仍被称为C语言的上层结构。它最后得名于C语言中的“++”操作符(其对变量的值进行递增)。而且在共同的命名约定中,使用“+”以表示增强的程序。Stroustrup说:“这个名字象征著源自于C语言变化的自然演进”。C+是一个和C/C++无关的早期编程语言。
Rick Mascitti在1992年被非正式地问起名字的由来,他表示这是在半开玩笑中说出的。他从没想过C++会成为这门语言的正式名字。
有一个关于C++名字的笑话是,当你使用后缀++时,附加只发生在运算之后(因此,它应该是++C,而不是C++,这个笑话是说时下某些程序员还在以使用C的方式使用C++,这通常被一些权威著作认为是不正确的)。
在《C++语言的设计和演化》(1994)中,Bjarne Stroustrup描述了他在设计C++时,所使用的一些原则。知道这些原则有助于理解C++为何会是现在这个样子。以下总结了一些原则,详尽的内容可参阅《C++语言的设计和演化》:
1998的C++标准分为两个部分:内核语言和C++标准程序库;后者包含了大部分标准模板库和C标准程序库的稍加修改版本。存在许多不属于标准部分的C++程序库,且使用外部链接,程序库甚至可以用C撰写。
C++标准程序库充分吸收了C标准程序库,并佐以少许的修改,使其与C++良好的运作。另一个大型的程序库部分,是以标准模板库(STL)为基础,STL于1994年2月正式成为ANSI/ISO C++。它提供了实用的工具,如容器(如:向量和链表),迭代器(一般化指针)提供容器以类似数组的访问方式,以及算法进行搜索和排序的运算。此外还提供了(multi)map(关联数组)和(multi)set,它们都使用兼容的界面。因此,以下成为可能,使用模板撰写泛型算法,它可以和任何容器或在任何以迭代器定义的序列上运作。如同C,使用#include指令包含标准表头,即可访问程序库里的功能。C++提供69个标准表头,其中19个不再赞成使用。
使用标准库(例如:使用std::vector或std::string来取代C风格的数组)有助于导向更安全和更灵活的软件。
STL在纳入C++标准以前,是来自HP和后来的SGI的第三方程式库,标准中并未称之为“STL”,它只是标准库中的一部分,但仍有许多人使用这个名称,以别于其它的标准库(输入/输出流式、国际化、诊断、C程序库子集,等等)。
和C语言相比,C++引入了更多的特性,包括:陈述性声明,类似函数的强制转型,new/delete操作符,布尔类型,参考类型,默认参数,函数重载,命名空间,类别(包括所有和类别相关的特性,如继承、成员函数、虚函数、抽象类别和建构子),操作符重载,模板,::操作符,异常处理和执行时期识别。
和普遍认为的相反,C++不是第一个引入const关键字的。Const是在正式引入C语言不久之后,才被C++采用。
C++在某些案例中(见下“与C不兼容之处”),进行比C还要多的类型检查。
以“//”起始作为注解起源自C的前身BCPL,而后被重新引入到C++。
C++的一些特性,C不久之后也采用了,包括在for循环中声明,C++风格的注解(使用//符号,和inline,虽然C99定义的inline关键字与C++的定义不兼容。不过,C99也引入了不存在于C++的特性,如:variadic macros,和以数组作为参数的较佳处理;某些C++编译器可能实作若干特性,以作为扩展,但其余部分并不符合现存的C++特性)
一个常见的混淆其实只是一个微妙的术语问题:由于它的演化来自C,在C++中的术语对象和C语言一样是意味着内存区域,而不是类别实体,在其它绝大多数的面向对象语言也是如此。举例来说,在C和C++中,语句int i;定义一个int类型的对象,这就是变量的值i将在赋值时,所存入的内存区域。
C++一般被认为是C的超集合(superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。
也许最常见的差异是,C允许从void*隐式转换到其它的指针类型,但C++不允许。下列是有效的C代码:
int *i = malloc(sizeof(int) * 5); /* 從 void* 隱式轉換為 int* */
但要使其在C和C++两者皆能运作,就需要使用强制转换:
int *i = (int *) malloc(sizeof(int) * 5);
另一个常见的可移植问题是,C++定义了很多的新关键字,如new和class,它们在C程序中,是可以作为识别字(例:变量名)的。
在最新的C标准(C99)中去除了一些不兼容之处,目前也支持了C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、本地复数类型和复合逐字常量),所以语言的分岐可能还是大过合并。
若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在extern "C" { /* C代碼 */ }之内。
在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
#include <iostream> int main() { std::cout << "Hello, world!\n"; }
在使用兼容C99标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:
#include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; return 0; }
根据ISO C++的规定,main函数的形式只能是
int main() { ... }
以及
int main(int argc, char * argv[]) { ... }
尽管如此,但在大部份编译器上,
void main() { .... }
也被支持。
C++主要有三个编译阶段:预处理、转译成对象码和链接(最后的两个阶段一般才视为真正的“编译”)。在第一阶段,预处理,会将预处理器指令替换成源代码,然后送到下一个编译阶段。
预处理指令的运作方式是根据使用者定义的规则,简单的把记号字符序列置换成其它的记号字符序列。它们进行宏置换、含入其它的文件(由底层至高级的特性,例如包含模块/包/单元/组件)、条件式编译和条件式含入。例如:
#define PI 3.1415926535897932384626433832795028841971693993751
每次在源代码中出现的PI,将会替换为3.1415926535897932384626433832795028841971693993751。另一个普遍的例子是
#include <iostream>
它从标准库表头iostream含入(导入)所有的符号。除了以上提到的常用指令以外,还有几个额外的预处理器指令,可以用来控制编译流程、条件式含入或排除代码区块等等。
| 这篇文章或章节需要更新。 这篇文章或章节的内容久未更新,已经过时,请更新本文以反映近况。 完成修改时,请移除本模板。 |
[1] 维基百科(中文)模板 (C++)
[2] 维基百科(英文)Template (Programming)
而作出“在这12年里,C++使用者人数大约每七个月半增加一倍”的结论,并成为许多C++相关文件必引的一段话。然而,时至今日新语言层出不穷,使用者人数已不太可能以如此速度增长。
分析机构EvansData定期对开发人员展开调查,其调查结果与Stroustrup提出的C++正在扩张的说法相违背。EvansData的数据显示,以C++为工具的开发人员在整个开发界所占的比例由1998年春天的76%下降至2004年秋的46%。
Forrester最新的调查显示,C++、微软VisualBasic和Java是众多公司产品体系的首选语言。对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。
|
查 • 论 • 编 • 历
|
|
|---|---|
| 工业编程语言 | A+ - ActionScript - Ada - 汇编语言 - B - Brainfuck - COBOL - Curl - D - Eiffel - Erlang - FORTRAN - IronPython - Java - JavaScript - JScript - Jython - LISP - Lua - SCILAB - MATLAB - MATHEMATICA - Nuva - Oberon - OCaml - Perl - PHP - PostScript - Powerbuilder - Python - R - REXX - Ruby - Self - Smalltalk - Tcl/Tk - C# - F# - J# - Microsoft Visual C# |
| C/C++语言 | C - C++ - Turbo C++ - Borland C++ - C++ Builder- C++/CLI - Objective-C - Microsoft Visual C++ |
| BASIC语言 | BASIC - BASICA - GW-BASIC - QBASIC - QuickBASIC - True BASIC - Turbo BASIC - PowerBASIC - DarkBASIC -ETBASIC Visual Basic .NET - Visual Basic - VBScript - VBA |
| Pascal/Delphi语言 | Pascal语法:(Pascal - Turbo Pascal - Object Pascal - Free Pascal) Pascal+Delphi语法:(Delphi) |
| GPU用着色器语言 | Cg - GLSL - HLSL |
| 学术编程语言 | APL/J - Clean - Haskell - Logo - ML - Prolog - Scheme - SAC |
| 数据库相关编程语言 | Clipper - Visual FoxPro - SQL - SQL預存程序 |
| 其他编程语言 | ALGOL - Forth - Modula-2/Modula-3 - MUMPS - PL/I - Simula |
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History