C++语言概述
C++是C的扩充版本.C++对C的扩充首先是由Bjarne Stroustrup于1980年在美国新泽西州玛瑞惠尔的贝尔实验室提出的.他开始把这种新的语言叫做"含类的C",到1983年才改名为C++.
尽管C++的祖先C是世界上最受喜爱和应用最广的专业程序设计语言之一,但C++的发明是必需的 .这主要是有程序设计的复杂性所决定的.在C里,一旦程序代码达到25000至100000行,它就会变得十分复杂,全面掌握就很困难了,而C++的目的正是要扫清这个障碍.C++的本质就是让程序员理解和管理更大更复杂的程序.
Stroustrup对C作了许多的补充以支持面向对象的程序设计(OOP).下一节对"面向对象的程序设计"有精确解释.Stroustrup宣称C++的某些面向对象的特点受到另一种所谓Simula67的面向对象语言的启发.所以,C++代表着两种强大的程序设计的结合.
自问世以来,C++经历了两次主要修订,一次在1985年,另一次是在1989年.在C++发明时,Stroustrop知道维持C的原来的精髓,如效率、灵活性以及程序员而不是语言所掌握的基础原理是很重要的,同时增加了对"面向对象程序设计"的支持.令人欣慰的是,他的目标达到了.C++仍然给程序员提供了对C的自由控制以及管理对象的能力.C++的面向对象的特点,用Stroustrup的话说,就是"使程序结构清晰、易于扩展、易于维护而不失其效率".
尽管C++当初的设计本意是帮助管理大型程序,但其用途并不仅限于此.事实上,C++的面向对象的特性可有效的用于实际的程序设计工作.C++常常用于设计编辑器、数据库、个人文件系统以及通讯程序等.而且,由于C++共享C的效率,所以用C++可以构成很多高性能的系统软件.
C++的优点
C++语言支持面向对象的程序设计,支持函数重载、运算符重载、以及动态联编;C++语言 支持抽象数据类型,与C相比提供了更好的类型检查机制,提供了更好的结构化程序设计技术;C++语言与其他面向对象的程序设计语言相比,最重要的优点是程序的执行效率高;C++保持与C的完全兼容,现有的C源代码不经修改就可以为C++所用,C程序员仅需要学习其新特性即可。
C++与C的区别
C++是由C发展而来的一套系统,它包含了C所有的特性(除了极少数的例外)。C++增强了原有C语言的某些功能,并且额外加入C语言未提供的许多新功能,以下将分别叙述C++不同于C语言的地方。下面是一个简单的C++程序,HELLO.CPP
#inculde <iostream.h>
void main()
{
cout<<"Hello,world";
}
以传统的C写成HELLO.C,如下:
#include <stdio.h>
void main()
{
printf("%s\n","Hello,world!");
}
比较这二个程序可看出主要差别为:
1.Include file 一个为<iostream.h>;另一个为<stdio.h>.
2.字符串输出前者使用“cout<<”;后者则用printf.
3.文件名称扩展名一个是.CPP;另一个是C.
在C++中,输入(Input)与输出(Output)的操作都归类为流(streams)“cout”是一个标准的输出流运算符"<<"的作用是将其右边的运算元素(字符串)送到左边(屏幕).C++的文件一般都使用.CPP作为其扩展名。以别于传统C语言文件,除此之外,有关流的输入、输出操作都须包含<iostream.h>这个文件头。"cout<<"除了可以输出字符串到屏幕之外,也可以输出其它类型的数据:
#include <iostream.h>
void main()
{
int x=5;
int y=10;
cout<<x+y;
}
以C语言则应写成:
printf("%d",x+y);
读者可能发现在C++中并不需要用格式字符串以区别输出的数据是字符串或数字,这此工作都由C++自行完成。再看下面的例子:
#include <iostream.h>
void amin()
{
int x=5;
int y=10;
cout<<"x+y="<<x+y<<'.';
}
cout可同时接受不同类型的数据输出,在上面的例子中,同时有字符串、数字、字符三种类型的数擗,其输出结果为:
x+y=15.
在C语言中的printf()函数,可指定各种数据的输出格式,如16进制、10进制或8进制,如printf("%x",val),这种输出方法也可应用于C++,然而C++有它另一种格式化输出的方法:
#include <iostream.h>
void main()
{
int x=25;
cout<<hex<<x<<' '<<dec<<x<<' '<<oct<<x;
}
其中hex=16进制转换,dec=10进制转换,oct=8进制转换。
此例执行结果为:
19 25 31
分别代表16进制,10进制及8进制的数字25。
C++的输入
cin的作用与cout恰好相反,cin负责输入而cout负责输出。一般的输入设务指的是键盘(Keyboard),
cin将从键盘读取数据传给指定的变量。
#include <iostream.h>
void main()
{
int x;
cout<<"请输入一个数字";
cin>>x;
cout<<"您所输入的数字为“<<x;
}
C++的注释
我们一直在强调,C语言有的功能C++绝大部分都有。因而,C的程序注释格式:
/*this is a comment*/
在C++中也行得通。C++另外提供一个更有效的注释格式,那就是双斜线(//),程序每一行在双斜线之后都会被视为注释,这对程序设计者无疑是一种方便的方法,因为它减少了许多键入的时间。
#include <iostream.h>
void main()
{
int x; //说明变量类型
cout<<"请输入一个数字“; //要求输入
cin>>x; //读取数值
cout<<"您所输入的数字为“<<x; //输出此数值
}
函数原型
C++在函数原型(function prototype)说明上的要求比C严格得多,C++每一个函数必须有一个原型,说明此函数的名称、参数的类型与数量、以及函数返回值的类型。其主要目的是让C++编译程序(Compiler)进行类型检查(type checking),以确定调用函数的参数及数量与事先定义的原型是否相符,以及返回值是否与原型相符,以确保程序的正确性。
大多数的C语言编译程序均不需给每一个函数有一个原型,如果省略了原型,C编译程序顶多会显示一个警告示信息(warning)而不影响程序的编译。C++则需要每一个函数都有各自的原型。
#include <iostream.h>
void main()
{
write("Hello,World!");
}
void write(char *s)
{
cout<<s;
}
上例main()调用write()输出一字符串,在C++的编译过程中,将检查出write()缺少原型而产生错误,正确的写法应该是:
#include <iostream.h>
void write(char *s); //函数原型的说明
void main()
{
write("Hello,World!");
}
void write(char *s)
{
cout<<s;
}
C++的参数说明方式必须放在函数名称的括号内,不可将函数的参数说明放在函数名称与函数之间。因此以下的说明方式在C++中是错误的!
#include <iostream.h>
void write(char *s); //函数原型的说明
void main()
{
write("Hello,World!");
}
void write(s)
char *s; //错误的参数说明方式!
{
cout<<s;
}
C++中的枚举
枚举是一种说明自定义类型的方法,它可用来说明一群具有个别名称的常数,C++与C都是使用enum来说明一组枚举,其间叭一的不同点是C++在使用已说明过的枚举时,不需再加上enum此关键定(keyword),可直接引用枚举的名称。也就是说,在C++中说明一个枚举后,它就变成了一个新的数据类型,其具有的地位与intchar,unsigned,long...等完全相同。
多态性函数
多态性函数是C++的一个主要特征,它允许一个函数名称拥有许多不同的功能,使程序设计更具灵活性。举例说,欲设计一个特殊函数,计算某数值的平方,可定义一函数如下:
int square(int x);
此函数计算一整数X的平方值。当要计算一个浮点数(floating-point)或双精度(double )数值的平方时上述的square()函数便不合乎用途了,需再额外另定义二个具有不同名称的函数:
float fsquare(float x);
double dsquare(double x);
而程序在调用这三个不同类型的函数(但功能相同)时,都需特别注意以不同的名称来调用它们,这对一个程序设计师而言,不但加重其编写程序时的困难,在维护程序过程中也会增加许多负担。因此,C++担供Overloaded function的解决方式。就上面的例子而言,要作的事情只有一项,那就是求某数的平方。在C++中,只需定义一个函数名称square(),然后以传给此函数参数类型来判断是要作int、double或是float的数值平方:
int square(int x);
float square(float x);
double square(double x);
C++自动按参数类型的不同而自动选择int、float或double版的square()函数,举例说:
square(3); ->使用int square()函数
square(3.32); ->使用bouble square()函数
square(3.32F); ->使用float square()函数
当程序定义了许多相同名称的函数时,C++编译器自动按参数的数目及其类型选择正确的函数。但是你不可以定义两个具有相同的名称与相同类型的参数,而其差异只是返回什的类型不同。如下例:
int response(char *prompt);
char *response(char *string); //错误的说明方式
换句话说,C++只按函数的参数表分辨相同名称的函数,若参数表相同,则认为是错误的说明。C++也允许拥有不同个参数的overloaded functions.
面向对象程序设计
"面向对象的程序设计"(OOP)是一种进行程序设计的新方法.自从计算机发明以来,程序设计的方法为了适应越来越复杂的程序发生了剧烈的变化.例如,计算机刚发明时,程序设计是通过计算机的前控制板用二进制机器指令打孔完成的.当程序长度只有几百条指令时,这种方法是可行的.随着程序的发展,发明了汇编语言,程序员用符号代表机器指令,能够处理更大更复杂的程序了.随着程序的进一步发展,出现了高级语言,它给程序员提供了更多的处理复杂性的工具.第一种广泛流行的语言当然是FORTRAN.虽然FORTRAN是令人难忘的第一步,但是它不是支持清晰、易懂程序的语言.
六十年代诞生了结构化的程序设计.这是诸如C语言和PASCAL语言支持的方法.结构化语言的应用使得有可能很容易编写复杂性适度的程序.但是,一旦设计达到一定的程序,即使使用结构化的程序设计方法也会变得无法控制,它的复杂性已经超出了程序员的管理限度.
考虑这一点,在程序设计发展道路上的每一个里程碑,就创建一种方法使程序员应付日益增长的复杂性.每前进一步,新方法都吸取了以前方法的优点并加以发展.今天,许多设计已经接近或达到结构化方法的工作极限.为了解决这个问题,面向对象的程序设计方法便应运而生.
面向对象的程序设计吸取了结构化程序设计的先进思想,并把它们同几个支持用户用新方法进行程序设计的有力的概念结合在一起.一般的讲,在用面向对象的方式进行程序设计时,都先把问题分为由相关部分组成的组,每一部分考虑和组相关的代码和数据,同时,把这些分组按层次关系组织起来,最后,把这些分组转换为叫做对象的独立单元.
所有面向对象的程序设计语言一般都包含三个概念,即对象、多态性和继承性.
编译链接
C++源程序的执行过程如图: