词条 | c++ |
释义 | C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。 简史美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在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 1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。 1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准。C++0x最终国际投票已于2011年8月10日结束,并且所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。先前被临时命名为C++0x的新标准将被称为C++ 2011。C++ 2011将取代现行的C++标准ISO/IEC 14882,它公开于1998年并于2003年更新,通称C++98以及C++03。国际标准化组织于2011年9月1日出版发布ISO/IEC 14882:2011,名称是:Information technology -- Programming languages -- C++ Edition: 3。 组成部分根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成: 1、C子语言。C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。 2、面向对象的C++语言。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本。 3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。 4、STL(C++标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。 此外,包含在TR1等中的C++0x将实现的新功能在开发和测试中。 发展阶段C++语言发展大概可以分为三个阶段: 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额; 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击; 第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。 特点· C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。 · C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。 · C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。 · C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。 · C++避免平台限定或没有普遍用途的特性。 · C++不使用会带来额外开销的特性。 · C++设计成无需复杂的程序设计环境。 出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。 在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行: 在使用比较老的编译器时,下面的程序也是可以的: 在使用兼容C++ 98标准的编译器时,应当是: 代码性能人们一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。 C++的Hello World程序在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行: # include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; } 在使用兼容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[]) { /* ... */ } 尽管如此,但在大部分编译器(例如Visual C++编译器)上, /* 永远不要这么写 */ void main() { /* ... */ } 也被支持。 编程技巧使用new和delete进行动态内存分配和释放 运算符new和delete提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点: (1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。 (2)自动地返回正确的指针类型,不用进行强制指针类型转换。 (3)可以用new对分配的对象进行初始化。 使用例子: (1)int* p; p=new int[10]; //分配一个含有10个整数的整型数组 delete[] p; //释放这个指向数组的指针所占内存 (2)int* p; p=new int (100);//动态分配一个整数并初始化 使用inline内联函数替代宏调用对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),当使用abs(i++)时,这个宏就会出错。 所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。 使用内联函数只须把inline关键字放在函数返回类型的前面。例如: inline int Add(int a,int b);//声明Add()为内联函数 这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。 使用函数重载在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C++中,函数名相同而参数数据类型不同的两个函数被解释为重载。例如: void PutHz(char* str);//在当前位置输出汉字 void PutHz(int x,?int y,?char * str);//在x,y处输入数字 使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。 用引用(reference)代替指针进行参数传递在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型。例如: void Add(int *a) { (*a)++; } 调用时则使用 Add(&x); //其中x为int或可以转化为int的类型,如unsigned int, 但这时候编译器通常会给出warning 对于复杂的程序,使用指针容易出错,程序也难以读懂。在C++中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。例如使用引用的函数定义为: void Add(int& a) { a++; //a为一个整数的引用 } 调用时使用 Add(x); //其中x为int 这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。 使用缺省参数在C++中函数可以使用缺省参数,例如: void PutHzxy(char *str,int x=-1, int y=-1) { if(x==-1) x=wherex(); if(y==-1) x=wherex(); moveto(x,y); PutHx(str); } 可以有三种方式调用函数PutHzxy(),例如: PutHzxy("C++语言");//使用缺省参数,在当前位置输出 PutHzxy("C++语言",10,10);//没有使用缺省参数 PutHzxy("C++语言",10);//对y使用缺省参数,指定x的位置 通常的情况下,一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C++的代码中都大量地使用了缺省参数。 需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。 例如: void PutHzxy(char*str,int x=-1,int y=-1)//正确 void PutHzxy(int x=-1,int y=-1,char*str)//错误 使用STLSTL(Standard Template Library,标准模板库), STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。 #include<vector>// 包含相关的头文件/ typedef std::vector<int> intvector;//使用typedef 使代码看起来更简洁 int main() { intvector vi; for(int i=0;i<10,i++) vi.push_back(i);//使用push_back添加元素 for(int i=0;i<vi.size();i++) std::cout<<vi[i]<<" ";//[]操作符被重载,使得我们可以像访问数组一样访问vector中的元素 } 开发方式在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合: 1.编译器:gcc,clang等 2.编辑器:一般是vim/emacs 3.make:gnu make 或者bsd 的pmake等,功能与用法基本一样 4.版本管理:cvs,svn,git等 5.代码阅读:cscope,ctags,lxr等 开发环境1.Visual Studio(Visual C++) 2.Borland C++ Builder 3.Eclipse(Myln + CDT + Mingw32 + GCC) 4.Dev-C++(Mingw32 + GCC) 5.Code::Blocks(可配合多款编译核心使用) 6.Codelite 7.C-Free 8.Qt Creator等基于Qt开发框架的IDE 如上所示,目前流行的GNU GCC和微软的Visual Studio系列各执一套基本的编译链,其他的IDE都是衍生产品 经典著作书名 备注 《The C++ Standard Library: A Tutorial and Reference》 《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》 《Effective STL》 在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。 影印版《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》 Douglas C. Schmidt, Stephen D. Huston,《C++ Network Programming》 Bruce Eckel,《Thinking in C++》影印版二版、三版(又名卷二) Andrew Koenig, Barbara E. Moo,《Ruminations on C++: A Decade of Programming Insight and Experience》 Stanley B. Lippman,影印版《Inside The C++ Object Model》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,《Design Patterns:Elements of Reusable Object-Oriented software》 John Lakos,《Large-Scale C++ Software Design》 候捷,《STL 源码剖析》 《The C++ Standard : Incorporating Technical Corrigendum No. 1》 C++面向对象程序设计(作者:Walter Savitch) C++ Primer中文版(第4版) 《C++ Primer中文版(第4版)》对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。第4版不再强调低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新编排,使讲解更加流畅。 C++ Primer plus(第五版) 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内的编程原理,涵盖了类、继承、模板、异常以及最新的面向对象编程技术等内容。 常见错误英文 参考译文 Ambiguous operators need parentheses 不明确的运算需要用括号括起 Ambiguous symbol ''xxx'' 不明确的符号 Argument list syntax error 参数表语法错误 Array bounds missing 丢失数组界限符 Array size toolarge 数组尺寸太大 Bad character in paramenters 参数中有不适当的字符 Bad file name format in include directive 包含命令中文件名格式不正确 Bad ifdef directive synatax 编译预处理ifdef有语法错 Bad undef directive syntax 编译预处理undef有语法错 Bit field too large 位字段太长 Call of non-function 调用未定义的函数 Call to function with no prototype 调用函数时没有函数的说明 Cannot modify a const object 不允许修改常量对象 Case outside of switch 漏掉了case 语句 Case syntax error Case 语法错误 Code has no effect 代码不可述不可能执行到 Compound statement missing{ 分程序漏掉"{" Conflicting type modifiers 不明确的类型说明符 Constant expression required 要求常量表达式 Constant out of range in comparison 在比较中常量超出范围 Conversion may lose significant digits 转换时会丢失意义的数字 Conversion of near pointer not allowed 不允许转换近指针 Could not find file ''xxx'' 找不到XXX文件 Declaration missing ; 说明缺少";" Declaration syntax error 说明中出现语法错误 Default outside of switch Default 出现在switch语句之外 Define directive needs an identifier 定义编译预处理需要标识符 Division by zero 用零作除数 Do statement must have while Do-while语句中缺少while部分 Enum syntax error 枚举类型语法错误 Enumeration constant syntax error 枚举常数语法错误 Error directive :xxx 错误的编译预处理命令 Error writing output file 写输出文件错误 Expression syntax error 表达式语法错误 Extra parameter in call 调用时出现多余错误 File name too long 文件名太长 Function call missing 函数调用缺少右括号 Fuction definition out of place 函数定义位置错误 Fuction should return a value 函数必需返回一个值 Goto statement missing label Goto语句没有标号 Hexadecimal or octal constant too large 16进制或8进制常数太大 Illegal character ''x'' 非法字符x Illegal initialization 非法的初始化 Illegal octal digit 非法的8进制数字 Illegal pointer subtraction 非法的指针相减 Illegal structure operation 非法的结构体操作 Illegal use of floating point 非法的浮点运算 Illegal use of pointer 指针使用非法 Improper use of a typedefsymbol 类型定义符号使用不恰当 In-line assembly not allowed 不允许使用行间汇编 Incompatible storage class 存储类别不相容 Incompatible type conversion 不相容的类型转换 Incorrect number format 错误的数据格式 Incorrect use of default Default使用不当 Invalid indirection 无效的间接运算 Invalid pointer addition 指针相加无效 Irreducible expression tree 无法执行的表达式运算 Lvalue required 需要逻辑值0或非0值 Macro argument syntax error 宏参数语法错误 Macro expansion too long 宏的扩展以后太长 Mismatched number of parameters in definition 定义中参数个数不匹配 Misplaced break 此处不应出现break语句 Misplaced continue 此处不应出现continue语句 Misplaced decimal point 此处不应出现小数点 Misplaced elif directive 不应编译预处理elif Misplaced else 此处不应出现else Misplaced else directive 此处不应出现编译预处理else Misplaced endif directive 此处不应出现编译预处理endif Must be addressable 必须是可以编址的 Must take address of memory location 必须存储定位的地址 No declaration for function ''xxx'' 没有函数xxx的说明 No stack 缺少堆栈 No type information/没有类型信息 缺少堆栈 Non-portable pointer assignment 不可移动的指针(地址常数)赋值 Non-portable pointer comparison 不可移动的指针(地址常数)比较 Non-portable pointer conversion 不可移动的指针(地址常数)转换 Not a valid expression format type 不合法的表达式格式 Not an allowed type 不允许使用的类型 Numeric constant too large 数值常太大 Out of memory 内存不够用 Parameter ''xxx'' is never used 能数xxx没有用到 Pointer required on left side of -> 符号->的左边必须是指针 Possible use of ''xxx'' before definition 在定义之前就使用了xxx(警告) Possibly incorrect assignment 赋值可能不正确 Redeclaration of ''xxx'' 重复定义了xxx Redefinition of ''xxx'' is not identical xxx的两次定义不一致 Register allocation failure 寄存器定址失败 Repeat count needs an lvalue 重复计数需要逻辑值 Size of structure or array not known 结构体或数给大小不确定 Statement missing ; 语句后缺少";" Structure or union syntax error 结构体或联合体语法错误 Structure size too large 结构体尺寸太大 Sub scripting missing ] 下标缺少右方括号 Superfluous & with function or array 函数或数组中有多余的"&" Suspicious pointer conversion 可疑的指针转换 Symbol limit exceeded 符号超限 Too few parameters in call 函数调用时的实参少于函数的参数不 Too many default cases Default太多(switch语句中一个) Too many error or warning messages 错误或警告信息太多 英文 参考译文 Too many type in declaration 说明中类型太多 Too much auto memory in function 函数用到的局部存储太多 Too much global data defined in file 文件中全局数据太多 Two consecutive dots 两个连续的句点 Type mismatch in parameter xxx 参数xxx类型不匹配 Type mismatch in redeclaration of ''xxx'' xxx重定义的类型不匹配 Unable to create output file ''xxx'' 无法建立输出文件xxx Unable to open include file ''xxx'' 无法打开被包含的文件xxx Unable to open input file ''xxx'' 无法打开输入文件xxx Undefined label ''xxx'' 没有定义的标号xxx Undefined structure ''xxx'' 没有定义的结构xxx Undefined symbol ''xxx'' 没有定义的符号xxx Unexpected end of file in comment started on line xxx 从xxx行开始的注解尚未结束文件不能结束 Unexpected end of file in conditional started on line xxx 从xxx 开始的条件语句 尚未结束文件不能结束 Unknown assemble instruction 未知的汇编结构 Unknown option 未知的操作 Unknown preprocessor directive: ''xxx'' 不认识的预处理命令xxx Unreachable code 无路可达的代码 Unterminated string or character constant 字符串缺少引号 User break 用户强行中断了程序 Void functions may not return a value Void类型的函数不应有返回值 Wrong number of arguments 调用函数的参数数目错 ''xxx'' not an argument xxx不是参数 ''xxx'' not part of structure xxx不是结构体的一部分 xxx statement missing ( xxx语句缺少左括号 xxx statement missing ) xxx语句缺少右括号 xxx statement missing ; xxx缺少分号 xxx'' declared but never used 说明了xxx但没有使用 xxx'' is assigned a value which is never used 给xxx赋了值但未用过 Zero length structure 结构体的长度为零 优点C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。 C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。 争议C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。 由于本身的复杂性,复杂的C++程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷,正说明C++被广泛使用和成功。 c++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linus torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。 参见《unix编程艺术》对c++的批评。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。