我是K,我致力于网络安全。
在上一篇博客当中,我们已经基本介绍了C++。那今天,我们继续学习C++的知识。
第一个C++程序
为了是大家了解什么是C++程序,下面就先介绍几个简单的C++程序。
例1:输出一行字符:“Hello World.”
#include
using namespace std;
int main()
{
cout<<"Hello World."<
运行结果:Hello World
程序分析:先看程序中的第三行,其中用main代表“主函数”的名字。每一个C++程序都必须有一main函数。main前面的int的作用是声明函数的类型为整型(标准C++规定main函数必须声明为int型,即此主函数返回一个整型的函数值)。程序的第六行(return 0;)的作用是想操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1.
函数体是由大括号{}括起来的。本例中主函数内有一个以cout开头的语句。cout是由c和out两个单词组成,顾名思义,它是C++用于输出的语句。cout实际上是C++系统定义的对象名,称为输出流对象。关于对象和输出流对象的概念将在第八部分和第十三部分中进行详细讲解。在没有学习对象和输出流对象以前,为了便于理解和使用,我们把用”cout”和“<<”实现输出的语句简称为cout语句。“<<”是“插入运算符”,与cout配合使用,在本例中它的作用是将运算符“<<”右侧双撇号内的字符串“Hello World”插入到输出的队列cout中(输出的队列也称为“输出流”),C++系统将输出流cout的内容输出到系统指定的设备(一般为显示器中)中,注意C++所有的语句最后都应当有一个分号。
在看程序的第一行“#include
程序的第二行“using namespace std;”的意思是“使用命名空间std”.。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C++标准库(此时需要用#include指令),就需要用“using namespace std;”作声明,表示要用到命名空间std中的内容。
初学C++时,对本程序中的1,2行可以不必追究,只需知道:如果程序有输入或输出时,必须使用“#include
例2:求a和b两个数之和。
//求两数之和 (本行是注释行)
#include //预处理指令
using namespace std; //使用命名空间std
int main() //主函数首部
{ //函数体开始
int a,b,sum; //定义变量
cin>>a>>b; //输入变量a和b的值
sum=a+b; //赋值语句
cout<<"a+b="<
程序分析:
本程序的作用是求两个整数a和b之和sum。第1行“//求两数之和”是一个注释行,C++规定在一行中如果出现“//”,则从它开始到本行末尾之间的全部内容都作为注释。注释只是给人看的,而不是让计算机操作的。注释是源程序的一部分,在输出源程序清单时全部注释按原样输出,以便看程序者更好地理解程序。但是在对程序编译时将忽略注释部分,这部分内容不转换成目标代码,因此对运行不起作用。注释可以加在程序中任何行的右侧。为便大家理解,在博客中用汉字表示注释,当然也可以用英语或汉语拼音作注释。
在一个可供实际应用的程序中,为了提高程序的可读性,常常在程序中加了许多注释行,在有的程序中,注释行可能只占程序篇幅的三分之一。在博客当中为了节省篇幅,不写太多的独立的注释行,而只在语句的右侧用“//”作简短的注释。
第6行是声明部分,定义变量a,b和sum为整型(int)变量。第7行是输入语句,cin是c和in两单词的组合,与cout类似,cin是C++系统定义的输入流对象。“>>”是“提取运算符”,与cin配合使用,其作用是从输入设备中(如键盘)提取数据送到数据流cin中,我们把用cin和“>>”实现输入的语句简称为cin语句。在执行程序中的cin语句时,从键盘输入的第1个数据赋值给整型变量a,输入的第2个数据赋值给整型变量b。第8行将a+b的值赋给整型变量sum。第9行先输出字符串“a+b=”,然后输出变量sum的值,cout语句中的endl是C++输出时的控制符,作用是换行(endl是end line的缩写,表示本行结束)。因此在输出变量sum的值之后换行。
运行结果:
输入:123 456
输出:a+b=579
大家可能注意到本程序的第6-10行的末尾都有一个分号,因为它们都是C++语句。
例3:输入两个数x和y,求两数中的大者。
本例中将包含两个函数。
#include //预处理指令
using namespace std;
int max(int x,int y) //定义max函数,函数值为整型,形式参数x,y为整型
{ //max函数体开始
int z; //声明变量,定义本函数中用到的变量z为整型
if(x>y) z=x; //if语句,如果x>y,则将x的值赋给z
else z=y; //否则,将y的值赋给z
return (z); //将z的值返回结束,通过max带回调用处
}
int main() //主函数
{ //主函数体开始
int a,b,m; //声明变量
cin>>a>>b; //输入变量a和b的值
m=max(a,b); //调用max函数,将得到的值赋给m
cout<<"max="<
本程序包含两个函数:主函数main和被调用的函数max。程序中第3-9行是max函数,它的作用是将x和y中的较大者的值赋给变量z。return语句将z的值返回给主调函数main。返回值是通过函数名max带回到main函数的调用处。主函数中cin语句的作用时输入a和b的值。main函数中第5行为调用max函数,在调用时将实际参数a和b的值分别传送给max函数中的形式参数x和y,经过执行max函数得到一个返回值(即max函数中变量z的值),把这个值赋给变量m。然后通过cout语句输出m的值。
运行结果:
输入:18 25
输出:max=25
注意输入的两个数间用一个或多个空格间隔,不能以逗号或其他符号间隔。如:
输入:18,25 或 18;25
是错误的,它不能正确输入第2个变量的值,使第2个变量有不可预见的值。
在上面的程序中,max出现在main函数中调用max函数时,编译系统能识别max是已定义的函数名。如果把两个函数的位置对换一下,即先写main函数,后写max函数,这时在编译main函数遇到max时,编译系统无法知道max代表什么含义,因而无法编译,按出错处理。
为了解决这个问题,在主函数中需要对被调用函数作出声明。对上面的程序进行改写。
#include
using namespace std;
int main()
{
int max(int x,int y);
int a,b,c;
cin>>a>>b;
c=max(a,b);
cout<<"max="<y) z=x;
else z=y;
return (z);
}
程序分析:
程序第4行就是对max函数作声明,它的作用是通知C++编译系统:max是一个函数,函数值是整型,函数有两个参数,都是整型。这样,在编译程序到第7行时,编译系统会知道max是已声明的函数,系统就会根据函数声明时给定的信息对函数调用的合法性进行检查,如果二者不匹配(例如参数的个数或参数的类型与声明时所指定的不符),编译就会出错。
细心的小伙伴可能会发现程序第4行的函数声明与程序第11行max函数的第1行(称为函数首部)基本相同。很容易写出函数声明,只要在被调用函数首部的末尾加一个分号,就成为对该函数的函数声明语句。函数声明的位置应当在函数调用之前(不能把程序第4行的内容放在第7行“c=max(a,b);”之后)。
本例用到了函数调用,实际参数和形式参数等概念,这里只做了很简单的解释。大家如对此不太理解,可以暂时不予追究,在学到第4部分时,问题自然迎刃而解。在此介绍此例子,目的是使大家对C++函数的形式和使用有一个初步的了解。
接下来我们将举一个包括类(class)和对象(object)的C++程序,目的是使大家初步了解C++是怎样体现面向对象程序设计方法的。由于还未系统的介绍面向对象程序设计的概念,大家可能对程序理解不深,现在只需有一个初步印象即可,在第8部分会详细介绍的。
例4:包含类的C++程序
#include
using namespace std;
class Student
{ private:
int num;
int score;
pubilc:
void setdata()
{ cin>>num;
cin>>score;
}
void display()
{ cout<<"num="<
程序分析:
这时一个包含类的最简单C++程序。程序第3-16行声明一个类Student。在一个类中包含两种成员:数据(如变量 num,score)和函数(如setdata函数和display函数),分别称为数据成员和成员函数。在C++中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为“类(class)”的数据结构。在上面的程序中,成员函数时用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。
类可以体现数据的封装性和信息隐蔽。在上面的程序中,在声明Student类时,把类中的数据和函数分为两大类:private(私有的)和pubilc(公用的)。把全部数据(num,score)指定为私有的,把全部函数(setdata,display)指定为公用的。当然也可以把一部分数据和函数指定为私有,把另一部分数据和函数指定为公用,这完全根据需要而定。在大多数情况下,都把所有数据指定为私有,已实现信息隐蔽。
凡是被指定为公用的数据或函数,既可以被本类中的成员函数调用,也可以被类外的语句所调用。被指定为私有的成员(函数或数据)只能被本类中的成员函数所调用,而不能被类以外的语句调用(除了以后介绍的“友元类”成员以外)。这样做的目的是对某些数据进行保护,只有被指定的本类中的成员函数才能调用它们,拒绝其它无关的部分调用它们,以防止误调用。这样才能真正实现封装的目的(把有关的数据与操作组成一个单位,与外界相对隔离),信息隐蔽是C++的一大特点。
可以看到:在类Student中,有两个公用的成员函数setdata和display。setdata函数的作用是给本类中的私有数据num和score赋以确定的值,这是通过cin语句实现的,在程序运行时从键盘输入num和score的值。display函数的作用是输出已被赋值的变量num和score的值。由于这两个函数与私有数据num和score是属同一个类Student的,因此函数可以直接引用num和score。
程序中第17行“Student stud1,stud2”是一个定义语句,它的作用是将stud1和stud2定义为Student类型的变量,这种定义方法和定义整型变量(int a,b;)的方法是一样的。区别只在于int是系统已预定义好的标准数据类型,而Student是用户自己声明的类型。Student类与int,float等一样都是C++的合法类型。具有“类”类型特征的变量称为“对象”(object)。stud1和stud2是Student类型的对象。和其它变量一样,对象是占实际存储空间的,而类型并不占实际存储空间,它只是给出一种“模型”,供用户定义实际的对象。在用Student定义了stud1和stud2以后,这两个对象具有同样的结构和特性。
程序中第18-24行是主函数。在主函数中有5个语句,其中前4个语句的作用是调用对象的成员函数。主函数中使用了两个对象stud1和stud2,因此在类外调用对象的成员函数时不能只写函数名(如“setdata();”),而必须说明要调用哪一个对象的函数,准备给哪一个对象中的变量赋值。因此要用对象的名字加以限定,如表1.1所示
表1.1 引用对象的成员
对象名 | num(学号) | score(成绩) | setdata函数 | display函数 |
stud1 | stud1.num(如1001) | stud1.num(如98.5) | stud1.setdata() | stud1.display() |
stud2 | stud2.num(如1002) | stud2.num(如76.5) | stud2.setdata() | stud2.display() |
其中,“.”是一个“成员运算符”,把对象和成员连接起来。stud1.setdata()表示调用对象stud1的setdata成员函数,在执行此函数中的cin语句时,从键盘输入的值(假设为1001和98.5)送给stud1对象的num和score,作为学生1(stud1)的学号和成绩。stud2.setdata()表示调用对象stud2中的setdata成员函数,在执行此函数中的cin语句时,从键盘输入的值(假设1002号和76.5)送给stud2对象num和score,作为学生2(stud2)学号和成绩。
程序中主函数中第1个语句用来输入学生1的学号和成绩。第2个语句用来输入学生2的学号和成绩。第3个语句用来输出学生1的学号和成绩。第4个语句用来输出学生2的学号和成绩
运行结果:
输入:1001 98.5
1002 76.5
输出:num=1001
score=98.5
num=1002
score=76.5
如果对以上的说明不甚理解,没有关系,将在第八部分中详细介绍。
通过这个例子,大家可以初步了解包含类的C++程序的形势和含义。
说明:以上几个程序时按照ANSI C++规定的语法编写的。由于C++是从C语言发展而来的,为了与C兼容,C++保留了C语言中的一些规定。其中之一是头文件的形式,在C语言中头文件用.h作为后缀,如stdio.h,math.h,string.h等。在C++发展初期,为了和C语言兼容,许多C++编译系统保留头文件以.h为后缀的用法,如iostream.h,但后来ANSI C++建议头文件不带后缀.h。近年推出的C++编译系统新版本采用了C++的新方法,提供了一批不带后缀名的头文件,如用iostream,string,cmath等作为头文件名。但为了使原来编写的C++程序能够运行,仍允许使用原有的后缀名.h的头文件,即二者同时并存,由用户选用。
例如:
#include
可以改写成
#include
由于C语言无“命名空间”,因此使用带后缀.h的头文件时不必用“using namespace std;”作声明。
有了以上的基础,在以后的章节中将由简到繁、由易到难、循序渐进地介绍C++编程。
King