第一章 C++语言概述
1.1 知识要点
1.C++语言的特点
(1)C++语言支持数据封装 封装是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。类是数据封装的工具,对象是封装的实现。
(2)C++类中包含私有、公有和保护成员 类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。封装体现了面向对象方法的“信息隐蔽和局部化原则”。
(3)C++语言中通过发送消息来处理对象 消息指对象之间在交互通讯中所传送的信息。消息由三部分构成:消息名、接收消息的对象标识和参数。一个对象向另一个对象发送消息请求某项服务,接收消息的对象响应该消息,进行所要求的服务,并把操作的结果返回给请求服务的对象。
(4)C++语言中允许友元破坏封装性
(5)C++语言允许函数名和运算符重载
(6)C++语言支持继承性 继承指子类(派生类)可以自动拥有父类(基类)的全部属性和服务。父类和子类是一般与特殊的关系。在定义一个子类时,可以把父类所定义的内容做为自己的内容,并加入若干新的内容
(7)C++语言支持动态联编 多态性是指在基类中定义的属性和服务被子类继承后,可以具有不同的数据类型和表现出不同的行为。当一个对象接收到一个请求进行某项服务的消息时,将根据对象所属的类,动态地选用该类中定义的操作。
2.C++程序的组成
注释部分(两种风格)、编译预处理部分(宏定义,文件包含和条件编译、)、程序正文部分(类型定义、常变量定义、函数定义)。最终,程序源代码由ASCII码组成类似单词或词组的单元(词法单元),可以用任意的文本编辑器编辑,源代码中的空白(空格、Tab、回车换行)用来表示词法单元的开始和结束,除这一功能外其余空白将被忽略,但如果是字符串内部的空白(不含回车换行,或者说字符串内不能直接回车换行,需要使用转义符)将作为字符串的一部分输出,不会忽略。
注释:
1)一对符号“/ *”与“* /”之间的内容称为注释。它可以占多行,是从C语言中继承来的一种注释形式。
2)一行中符号“//”之后的内容也称为注释。它只能占一行,是C++语言特有的一种注释形式。
编译预处理命令:
C++的编译预处理命令以“#”开头。C++提供了三类编译预处理命令:宏定义、文件包含和条件编译。
程序主体:用函数组织过程,每个相对独立的过程都要组织成一个函数;不同的程序由不同的函数按层次结构组织而成。一个C++程序至少且仅包含一个main()函数,也可以包含一个main()函数和若干个其他函数。其他函数可以是系统提供的库函数(例如printf()和scanf()函数),也可以是用户根据需要自己编制设计的函数
3.函数
C++的程序由若干个文件组成,文件名的后缀为.cpp(c plus plus)。每个文件又是由函数组成,函数之间可以调用。在这些函数中只有一个函数是主函数main()。程序执行时,操作系统先调用主函数,主函数再依次调用其它函数完成设计任务。
4.程序的编辑、编译、连接和运行
(1)编辑 编辑是将编写好的C++源程序输入到计算机中,生成磁盘文件的过程。
(2)编译和连接过程
编译器的功能是将程序的源代码转换成为机器代码的形式,称为目标代码,然后,再将目标代码进行连接,生成可执行文件。
编译过程又可分为三个子过程。
(1)预处理过程:对源程序编译时,先进行预处理,如果源程序中有预处理命令,则先执行这些预处理命令,执行后再进行下面的编译过程。
(2)编译过程:编译过程主要是进行词法分析和语法分析的过程,又称源程序分析。
1)词法分析。2)语法分析。3)符号表。4)错误处理程序。5)生成目标代码。
连接过程:这是编译的最后一个过程,将用户程序生成的多个目标代码文件和系统提供的库文件中的某些代码连接在一起由连接器生成一个可执行文件,存储这个可执行文件的扩展名为.exe。
(3)运行 一个C++的源程序经过编译和连接后生成了可执行文件。运行可执行文件可在编译系统下选择相关菜单项来实现,也可以采用其他方法。
1.2 典型例题分析与解答
例题1:显示“I am a student”字符串,并通过简单的程序了解和熟悉运用VC++开发环境进行编写、编译、调试、显示结果的过程。
解答:该程序非常简单,如下代码所示,运用了cout输出流对象代表标准输出显示器,<<代表后边的字符串向显示器输出的方向。
#include <iostream.h>
void main()
{cout<<”I am a student”<<endl; }
编辑过程:
图1-1 新建对话框
①编辑
编辑是将C++源程序输入计算机的过程。在Visual C++6.0主界面下,点击File菜单,选择New菜单项,即可出现New对话框,如图1-1所示。在弹出窗口中的Files标签页下,选择C++ Source File。在选项卡右面的文件编辑框里输入文件名如“Exa”,在目录编辑框里输入文件路径,如“d:/test”。点击确认按钮。将出现编辑窗口,如图1-2所示。
在图1-2所示的右端编辑窗口里输入以下C++源程序并保存文件。
图1-2 编辑窗口
②编译
编译是使用系统提供的编译器将文本文件Exa.cpp生成机器语言的过程,结果为Exa.obj,由于没有得到系统分配的绝对地址,还不能直接运行,如图1-3所示。选择编译菜单下的编译 Exa.cpp,计算机将完成对当前源程序的编译。按提示建立默认工程空间。编译无错时,将源程序Exa.cpp编译为目标文件Exa.obj。
图1-3 编译源程序
③连接
连接是将目标文件Exa.obj转换为可执行文件Exa.exe的过程。如图1-4所示选择编译菜单下的构件 Exa.exe。连接无错时,将目标文件Exa.obj连接为Exa.exe。
图1-4 源程序
④运行
运行是执行可执行文件Exa.exe,屏幕输出运行结果。如图1-5所示选择编译菜单下的执行 Exa.exe。
图1-5 运行程序
运行结果如图1-6所示:
图1-6 运行结果
例题2:输入一名学生的成绩,判断该成绩的等级。
如>=60的,显示“合格”,<60的显示“不合格”。
程序:
#include<iostream.h> //输入输出流对象的头文件
void main()
{ int score; //声明成绩变量,用来保存分数
cout<<”输入成绩:”; //提示用户的信息
cin>>score; //从键盘上输入分数传递给score
if( score>=60) //判断该条件是否真或假
cout<<”合格”<<endl; //当score>=60是真的时候,运行该语句
else
cout<<”不合格”<<endl; //当score>=60是假的时候,运行该语句
}
分析:
(1) 首先该题目要求输入一个分数,则事先声明一个整型变量score。
(2) 其次从键盘上输入该分数,应有输入语句cin,并由上面定义的变量来保存分数。
(3) 然后根据分数来判断等级,有两种情况应该用if语句。
(4) 输出的信息是根据不同条件显示字符串,用到cout输出流对象。
(5) 用到标准输入输出流对象,所以在程序前加相应头文件。
例题3:面向对象的( )是一种信息隐蔽技术,目的在于将对象的使用者与设计者分开。不允许使用者直接存取对象的属性,只能通过有限的接口与对象发生联系。
A.多态性 B.封装性 C.继承性 D.重用性
答案B
分析:封装性是指把对象属性和操作结合在一起,构成独立的单元,其内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。
若不清楚多态性的定义,误选答案A。多态性是指当一个对象接收到一个请求进行某项服务的消息时,将根据对象所属的类,动态地选用该类中定义的操作。若不清楚继承性的定义,误选答案C。继承是指派生类可以自动拥有基类的全部属性和服务。若不清楚重用性的定义,误选答案D。重用性是多态性的一种表现形式。
例题4:C++源文件的扩展名为( )。
A.cpp B.c C.txt D.exe
答案A
分析:C++源程序的扩展名为cpp。C程序的扩展名为c。文本文件的扩展名为txt。源程序编译后可执行文件的扩展名为exe。
若不清楚C++源程序扩展名和C源程序扩展名的区别,误选答案B。C++兼容C,当文件名保存为c时,调用C编译器;当文件名保存为cpp时调用C++编译器。若不清楚C++源程序扩展名和文本文件扩展名的区别,误选答案C。C++源程序可以在文本编辑器里编辑,但一定注意将其扩展名保存cpp,不能为txt。若不清楚C++源程序和C++可执行文件的扩展名的区别,误选答案D。C++源程序经过编译、连接后得到可执行文件的扩展名为exe。
例题5:C++的合法注释是( )。
A./*This is a C program/* B.// This is a C program
C. “This is a C program” D.//This is a C program//
答案:B
分析:单行注释常采用“//”,多行注释采用“/*”和“*/”。单行注释也可采用“/*”和“*/”,但答案A书写格式错误,不能选答案A。注释和字符串的区别,双引号内的字符为字符串。不能选答案C。单行注释不需要结束符“//”,如果有,只能作为注释的一部分存在。也不能选答案D。
例题6:下面标识符中正确的是( )。
A._abc B.3ab C. int D.+ab
答案:A
分析:C++的标识符由字母、下划线和数字组成,而且第一个字符不能为数字。答案B第一个字符为数字不能选B。标识符不能为关键字,不能选答案C。答案D第一个字符不是字母或下划线,也不能选。
例题7:分析下列该程序的错误。输入数据格式为:2,5(回车)。
main()
{ int sum=0;
int a,b;
cout<<"input a,b:";
cin>>a>>b;
sum=a+b;
cout<<sum<<endl;
}
本程序把输入的两个数据进行累加并输出结果。输入数据格式为:2 5。
#include <iostream.h> // 编译预处理命令,以“#”开头。把系统已经定义好的输入
//输出功能包含到本程序中。
void main() // 程序的主函数
{ // 主函数开始
int sum=0; // 定义一个变量sum存放累加结果,并且赋初值为0
int a,b; // 定义两个变量,保存输入值
cout<<"input a,b:"; // 提示输入
cin>>a>>b; // 使用基本输入设备cin输入两个变量值
sum=a+b; // 进行累加,结果保存到sum变量
cout<<sum<<endl; // 使用基本输出设备cout输出累加结果sum
}
分析:
(1)没有使用编译预处理命令:#include。iostream.h是系统定义的一个头文件(h-head),设置了C++的I/O环境。cin、cout为基本输入、输出设备,定义在iostream.h头文件中。
(2)没有main()函数的返回类型,系统提示警告。main()函数的返回类型常标注为void。
(3)输入数据时没有使用空格分隔。输入运算符“>>”要求输入的多个数据用空格分隔。
1.3 教材习题分析与解答
1.参照例题,编写一个能输出以下信息的程序。
How are you.
Fine,thank you.
程序:
#include<iostream.h>
Void main()
{ Cout<<”How are you.”<<endl; //输出字符串并换行。
Cout<<”Fine,thank you.”<<endl;
}
2.参照例题,编写一个求两个数78、45之差的程序。
程序:
#include <iostream.h>
void main()
{ int sum=0;
sum=78+45; //求和
cout<<"78+45= "<<sum<<endl;
}
3.参照例题,编写一个求三个数14、25、16之和的程序。
#include <iostream.h>
void main()
{ int a,b,c,sum; //定义变量
cout<<"input three number:/n";
cin>>a>>b>>c; //从键盘输入三个数给变量a和b、c
sum=a+b+c; //求和
cout<<"sum is "<<sum;
}
4.上机运行本章的三个例题,熟悉所用系统的上机方法与步骤。
略
5.上机运行本章习题1、2和3。
略
1.4 补充习题
1.下面的( )不是C++所包含的要素。
A.重载 B.对象 C.类 D.继承
2.下列标识符中,( )是合法的。
A.goto B.Student C. 123 D.k-ld
3.在C++语言中,( )的陈述是正确的。
A.能使用关键字并区分大小写 B.能使用关键字并不区分大小写
C. 不能使用关键字并区分大小写 D.不能使用关键字并不区分大小写
4.C++语言中语句的结束符是( )。
A. , B. ; C. 。 D. 、
5.下面对于类的描述,( )是错误的。
A.类是抽象数据类型的实现 B.类是具有共同行为的若干对象的统一描述体
C. 类是创建对象的模板 D.类就是C语言中的结构类型
6.写一个程序输出 Hello,C++!。
7.编译下列程序,改正错误信息,分析输出结果。
#include <iostream.h>
void main()
{ int x,y;
cout<<"input x:"<<endl;
cin>>x;
y=x*x;
cout<<"y=<<y<</n";
}
8.下列程序有何错误?
#include <stdio.h>
void main()
{ cout>>"Hello">>endl;}
9.关于C++和C语言的描述中,( )是错误的?
A.C是C++的一个子集 B. C程序在C++环境可以运行
C. C++程序在C环境可以运行 D. C++是面向对象的而C是面向过程的
10.给出下列程序的运行结果。
#include <iostream.h>
void main()
{
int a(2),b(3),c(4);
cout<<"c1="<<c<<endl;
c=a+b;
cout<<"c2="<<c<<endl;
}