您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 第1章C++的初步知识
第1章C++的初步知识上学期是以C为蓝本来讲解,这学期需要增加一些C++的内容,这是进入C/C++程序设计II学习的前期准备。1.1从C到C++C语言是结构化和模块化的语言,它是面向过程的。能处理小规模的程序。但当规模较大时会显示出它的不足。为了解决这个软件危机,提出了面向对象的程序设计(objectorientedprogramming,OOP)思想。C++保留了C语言原有的所有优点,增加了面向对象机制。所以C++也称为“带类的C”。C++对C的“增强”,表现在以下两个方面:1、在原来面向过程的机制基础上,对C语言的功能作了扩充。(本章将介绍充分部分)2、增加了面向对象的机制。在面向对象的程序设计中仍然要用到结构化程序设计的知识。下面介绍C++对C的扩充,及与C的差别所在。1.2最简单的C++程序C++程序在结构上与C的差别如下:1、标准C++规定main函数声明为int型,即此主函数带回一个整型的函数值。程序如果正常执行,则操作系统返回数值0,否则返回数值-1。2、系统头文件不带后缀.h,如:#includeiostream3、使用系统库时要使用命名空间std。即使用usingnamespacestd;,这句话的意思是使用命名空间std。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C++标准库,就需要用usingnamespacestd;来声明,表示要用命名空间std中的内容。例1.1最简单的只有输出的程序#includeiostreamusingnamespacestd;intmain(){coutThisisaC++programm.\n;//cout是对象名,称为输出流对象。“”是插入运算符return0;//没有此句会有警告。最好加上此句}例1.2最简单的有输入的程序#includeiostreamusingnamespacestd;intmain(){inta,b,sum;cinab;//cin是输入流对象。“”是提取运算符sum=a+b;couta+b=sumendl;return0;//没有此句会有警告。最好加上此句}例1.3输入二个数x和y,求两个数中的大者。(要求用函数实现,学生练习)例1.4对学生信息进行输入也输出。1)用结构体实现#includeiostreamusingnamespacestd;structStudent{intnum;intscore;};voidinput(structStudent*ps){cinps-num;cinps-score;}voidoutput(structStudents){couts.numendl;couts.scoreendl;}intmain(){structStudents;input(&s);output(s);}以上数据与对数据的操作(函数)是分开的2)用类来实现classStudent{private:intnum;intscore;public:voidinput(){cinnum;cinscore;}voidoutput(){coutnumendl;coutscoreendl;}};intmain(){structStudents;s.input();s.output();}数据与对数据的操作(函数)是一个整体。类中的函数也是一个成员,叫着成员函数。数据成员被说明为私有的,在类外是不能使用的。1.3C++对C的扩充1.3.1C++的输入输出在C++中是通过调用输入输出流库中的流对象cin和cout实现的。流指的是来自设备或传给设备的一个数据流。cout是输出流对象的名字,cin是输入流对象的名字。一、输入流与输出流的基本操作cout语句的一般格式为:cout表达式1表达式2……表达式n;cin语句的一般格式为:cin变量1变量2……变量n;当程序需要在屏幕上显示输出时,可以使用插入操作符,向cout输出流中插入字符。例如:coutThisisaprogram.\n;当程序需要执行键盘输入时,可以使用抽取操作符,从cin输人流中抽取字符。例如:inta;cina;。不管把什么基本数据类型的名字或值传给流,它都能懂。例如,下面的程序是输出字符串和整数:#includeiostreamusingnamespacestd;intmain(){coutThisisaC++program.endl;coutThisisaC++program.endl;coutThisis;coutaC++program.;coutendl;cout2;coutendl;return0;}从上面的程序可以看出,输出的写法可以在同一行串连也可以分在几行。cin可以和cout一样的方式调整行,它自动识别变量位置和类型。例如:inta;floatb;charc;,则cinabc;,也可以写成:cina;cinb;cinccin能够知道抽取的变量的类型,它将对a,b,c分别给出一个整型、浮点型和字符型数。二、输入流与输出流中使用控制符(第七章中详细介绍,这里了解就可以了)流的默认格式输出有时不能满足特殊要求,如:doubleaverage=9.400067;coutaverageendl;希望显示的是9.40,即保留两位小数,可是却显示了9.40007,默认显示6位有效位。用控制符(manipulators)可以对I/O流的格式进行控制。控制符是在头文件iomanip.h中定义的对象。可以直接将控制符插入流中。常用控制符如下表所列。表1I/O流的常用控制符控制符描述DecHexOctsetfill(c)setprecision(n)setw(n)setiosflags(ios::fixed)setiosflags(ios::scientific)setiosflags(ios::left)setiosflags(ios::right)setiosflags(ios::skipws)setiosflags(ios::uppercase)setiosflags(ios::lowercase)置基数为10置基数为16置基数为8设填充字符为c设显示小数精度为n位设域宽为n个字符固定的浮点显示指数表示左对齐右对齐忽略前导空白16进制数大写输出16进制数小写输出使用控制符时,要在程序的头上加头文件iomanip.h。#includeiostream#includeiomanipusingnamespacestd;intmain(){inti=100;coutiendl;couthexiendl;doubled=123.4567890123456;coutdendl;coutsetprecision(9)dendl;return0;}1.3.2用const定义常变量在C语言中常用#define命令来定义符号常量,实际上,只是进行字符置换,容易误解。#includeiostreamusingnamespacestd;#defineR2+3intmain(){coutR*Rendl;//输出结果是11,并不是25return0;//没有此句会有警告。最好加上此句}下面看C++提供的const定义常变量的方法就避免这个问题。#includeiostreamusingnamespacestd;constintR=2+3;intmain(){coutR*Rendl;//输出结果是25return0;//没有此句会有警告。最好加上此句}1.3.3函数原型声明在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前必须对所调用的函数作函数原型声明,这是强制性的。如有定义:intmax(inta,intb){returna+b;}声明时必须写成:intmax(inta,intb);或intmax(intx,inty);或intmax(int,int);1.3.4函数的重载1、为什么要用重载函数在C中,在同一作用域中不能有同名的函数,每个函数必须有其唯一的名字,这样有时会令人生厌。例如,求一个数的绝对值,由于要求命名唯一,所以对于不同的类型需要不同名字的函数:intabs(int);floatfabs(float);longlabs(long);doublelabs(double);极其相似操作函数我们却起三个不同的名字,这样子不是很好管理,所以C++为了方便程序员编写程序特别引入了函数重载的概念来解决此问题。C++允许在同一作用域用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能。这就是函数的重载。重载是用来描述同名函数具有相同或者相似功能,但数据类型或者是参数不同的函数管理操作的称呼。同一个函数名可以用来代表不同功能的函数,也就是一名多用。这几个函数所做的事情是一样的都是求绝对值。因此,使用三个不同的函数名,看上去很笨拙,若给以同样的名字就会方便得多。这就是重载技术。这种技术在C++中早已用于基本数据类型运算,如加法只有一个名字+,但它可以用来加整数值、浮点值和指针值。插入运算符“”和提取运算符“”既可以左移和右移也可以是输入输出运算符。例如,上述4个函数的声明可以改为:intabs(int);floatabs(float);longabs(1ong);doubleabs(double);C++用一种函数命名技术可以准确判断出应该使用哪个abs()函数。例如:abs(-10);//调用intabs(int);abs(-1000000);//调用longabs(1ong);abs(-12.23);//调用doubleabs(double);2、匹配重载函数的顺序在调用一个重载函数f()时,编译器必须搞清函数名f究竟是指哪个函数。这是靠将实参类型和所有被调用的f()函数的形参类型一一比较来判定的。按下述3个步骤的先后顺序找到并调用那个函数:(1)寻找一个严格的匹配,如果找到了,就用那个函数。(2)通过内部转换寻求一个匹配,只要找到了,就用那个函数。(3)通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就用那个函数例如,重载函数print()的匹配:voidprint(double);voidprint(int);voidfunc(){print(1);//匹配voidprint(int);print(1.0);//匹配voidprint(double);print('a');//匹配voidprint(int);print(3.1415f);//匹配voidprint(double);}例如,对于重载函数print()声明,其下面的函数调用将引起错误:voidprint(1ong);voidprint(double);voidfunc(inta){print(a);//error:因为有二义性}3、使用说明(1)C++的函数如果在返回类型、参数类型、参数个数、参数顺序上有所不同,则认为是不同的。但重载函数如果仅仅是返回类型不同,则是不够的。例如,下面的声明是错误的:voidfunc(int);intfunc(int);编译器无法区分函数调用func(3)”是指上述哪一个重载函数。因此重载函数至少在参数个数、参数类型或参数顺序上有所不同。(2)typedef定义的类型只能使之相同于一个已存在的类型,而不能建立新的类型,所以不能用typedef定义的类型名来区分重载函数声明中的参数。例如,下面的代码实际上是同一个函数:typedefINTint;voidfunc(intx){//...}voidfunc(INTx){//...)//error:函数重复定义编译器不能区分这两个函数的差别,INT只不过是int的
本文标题:第1章C++的初步知识
链接地址:https://www.777doc.com/doc-2244515 .html