C语言试题、学习、考试大全.ppt_第1页
C语言试题、学习、考试大全.ppt_第2页
C语言试题、学习、考试大全.ppt_第3页
C语言试题、学习、考试大全.ppt_第4页
C语言试题、学习、考试大全.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序设计基础,福州大学数学与计算机科学学院 吴英杰,2020/8/10,福州大学数学与计算机科学学院,2,C+语言概述 面向对象的程序设计语言,C+支持数据封装,C+类中包含私有、公有和保护成员,C+通过发送消息来处理对象,C+中允许友元破坏封装性,C+允许函数名和运算符重载,C+支持继承性,C+支持动态联编,在C+中,结构可作为一种特殊的类,它虽然可以包含函数,但它没有私有或保护的成员。,在C+中,类是支持数据封装的工具,对象则是数据封装的实现。类是类型,是对象的抽象,对象是类的具体实例。一个类可以有多个对象,每个对象都有自己的存储单元,而类不占存储单元。 C+中类是数据和函数的封装体,

2、它提供一种数据访问严格控制的机制,数据被隐藏在封装体中,该封装体通过操作接口与外界交换信息。,友元可以是在类外定义的函数,也可以是在类外定义的整个类。友元可以访问类的私有成员。,面向对象的程序设计的四大特征: 抽象、封装、 继承 、 多态 。,2020/8/10,福州大学数学与计算机科学学院,3,C+与C语言的关系: C语言是C+的一个子集,C+包含了C语言的全部内容。,C+保持与C语言的兼容 C+对C语言作了很多改进 C+与C语言的本质差别在于C+是面向对象的,而C语言是面向过程的。,(1) 增加了一些新的运算符,如 :, new, delete, -* 等; (2) 改进了类型系统,增加了

3、安全性; (3) 引进了引用的概念,使用引用作函数参数带来了很大方便; (4) 允许函数重载,允许设置缺省参数,提高了编程的灵活性; (5) 引进内联函数,提高了程序效率; (6) 可根据需要随时对变量进行说明。,面向过程的程序设计将数据和对数据的操作分离,程序是 由一个个的函数组成的,面向对象的程序设计将数据和操 作封装在一起,程序是由一个个对象组成的,对象之间通 过接口进行通信,它能够较好地支持程序代码的复用。,2020/8/10,福州大学数学与计算机科学学院,4,C+数据操作基础,2020/8/10,福州大学数学与计算机科学学院,5,cin是一个代表标准输入设备(一般代表键盘设备)的对象

4、, cout 是一个代表标准输出设备(一般代表显示设备)的对象, 它们都是C+系统预定义的对象。它们以及输入操作符“”和输出操作符“”都在头文件 iostream.h 中被声明。,2020/8/10,福州大学数学与计算机科学学院,6,2.2 控制结构 条件语句,循环语句,转移语句,2.2.1 条件语句 if 语句 if else 语句 if elseif 语句 ?条件操作符 switch语句,2020/8/10,福州大学数学与计算机科学学院,7,if ( 条件表达式 ) 语句序列 ,if ( 条件表达式 ) 语句序列1 else 语句序列2 ,if ( 条件表达式1 ) 语句序列1 elsei

5、f ( 条件表达式2 ) 语句序列2 elseif ( 条件表达式3 ) 语句序列3 else 语句序列4 ,2020/8/10,福州大学数学与计算机科学学院,8,?是一个三元操作符,被称为条件操作符。使用语法是: 表达式1?表达式2 : 表达式3,等价于: if ( 表达式1 ) 表达式2 ; else 表达式3 ;,例:result = ( a = 0 ) ? a : -a,注意:表达式1、2、3的数据类型不能是 void 类型。,2020/8/10,福州大学数学与计算机科学学院,9,switch ( 变量名 ) case 值1 : 语句序列1 ; break ; case 值 2 : 语

6、句序列2 ; break ; default : 语句序列 n ; ,2020/8/10,福州大学数学与计算机科学学院,10,2.2.2 循环语句,for 循环: for ( exp1; exp2; exp3) statement;.,while 循环: while ( expression) ,do while 循环: do statement; . while (expression);,三种循环都可以嵌套。,2020/8/10,福州大学数学与计算机科学学院,11,for ( exp1; exp2; exp3) statement;.,等价于: exp1 ; while ( exp2 )

7、statement ; exp3 ; ,例: int sum = 0 ; for ( int i = 1 ; i = 10 ; i + ) sum += i;,2020/8/10,福州大学数学与计算机科学学院,12,2.2.3 转移语句,break 语句:强制退出循环及中断case语句,直接执行循环体后的语句。,continue 语句:不完全退出循环,而是使循环重新回到测试位置,并忽略此语句至循环结束前的语句序列。,goto 语句:无条件转移,只限在同一程序段内转换,不能跳到另一函数或程序内。,2020/8/10,福州大学数学与计算机科学学院,13,2.3 指针 1. 定义:包含另一变量内存地

8、址的变量。,3. 指针与数组的关系 数组是指针的另一种表示法。数组的名字实际就是数组的起始地址。 int arr2 = 0,1; arr1 和 *(arr + 1)是完全一致的。,2. 声明 指针在使用前需进行声明,声明格式为: 数据类型 *变量; 或 数据类型* 变量;,2020/8/10,福州大学数学与计算机科学学院,14,4. “ int *p; p = ,“* ”也是一个一元操作符,用于表达被指针指向的对象。,2020/8/10,福州大学数学与计算机科学学院,15,5. new 与 delete new 用于为指针分配内存空间;delete 用于释放指针所占有的内存空间。,标准C用ma

9、lloc 和 free 函数分配内存块和释放内存块。,2020/8/10,福州大学数学与计算机科学学院,16,(5.1) 运算符new : 运算符new用于动态存储分配。 new返回一个指向所分配空间的指针。 例:int y;y=new int;y=10; 也可将上述各语句作适当合并如下: int y=new int;y=10; 或 int y=new int(10); 或 int y;y=new int(10);,2020/8/10,福州大学数学与计算机科学学院,17,(5.2) 一维数组 :,为了在运行时创建一个大小可动态变化的一维浮点数组x,可先将x声明为一个float类型的指针。然后用

10、new为数组动态地分配存储空间。 例: float x=new floatn; 创建一个大小为n的一维浮点数组。运算符new分配n个浮点数所需的空间,并返回指向第一个浮点数的指针。然后可用x0,x1,xn-1来访问每个数组元素。,2020/8/10,福州大学数学与计算机科学学院,18,(5.3) 运算符delete :,当动态分配的存储空间已不再需要时应及时释放所占用的空间。 用运算符delete来释放由new分配的空间。 例: delete y; delete x; 分别释放分配给y的空间和分配给一维数组x的空间。,2020/8/10,福州大学数学与计算机科学学院,19,(5.4) 动态二维

11、数组 :,创建类型为Type的动态工作数组,这个数组有rows行和cols列。,template void Make2DArray(Type* ,2020/8/10,福州大学数学与计算机科学学院,20,当不再需要一个动态分配的二维数组时,可按以下步骤释放它所占用的空间。首先释放在for循环中为每一行所分配的空间。然后释放为行指针分配的空间。 释放空间后将x置为0,以防继续访问已被释放的空间。,template void Delete2DArray(Type* ,2020/8/10,福州大学数学与计算机科学学院,21,2.4 函数与参数传递 当一个函数定义有形参时,在进行函数调用时,必须提供与形

12、参个数、类型相同的实参。 在C+中,有两种参数传递机制将实参的值传递给形参:值传递( 值调用 )和引用传递( 引用调用 )。,1. 值传递 在这种机制中,实参的值被拷贝到由相应形参名字所标识的对象中。在函数内部对形参的访问或更新都是是对这个对象的访问或更新。实参本身的值在调用前后和调用过程中都不发生变化。,2020/8/10,福州大学数学与计算机科学学院,22,int double( int a ) a *= 2 ; cout“a=“aendl; return a; ,#include void main() int b = 10; double(b); cout“b=“b; ,运行结果: a

13、=20 b=10,2020/8/10,福州大学数学与计算机科学学院,23,2. 引用传递 若希望通过函数调用改变实参的值,就必须采用引用传递机制。 关于引用的具体含义及使用要点将在3.7节中讲解。,void swap( int ,2020/8/10,福州大学数学与计算机科学学院,24,第三章 类与对象,本章主要内容:,类的成员 构造函数与析构函数;数据成员和成员函数;内联函数;,类和对象的定义,this指针,const关键字,友元函数,引用,2020/8/10,福州大学数学与计算机科学学院,25,3.1 类的定义 类是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括结构特征和行为特征)

14、集中起来,以说明该组对象的能力和性质。 类(class)是一种用户自定义的数据类型。,class 类名称 type vars ; member functions ; public: type vars ; member functions ; ;,2020/8/10,福州大学数学与计算机科学学院,26,class CPerson char name; public: int age; float height; void PrintAge(); void PrintHeight(); ;,2020/8/10,福州大学数学与计算机科学学院,27,注意: 1. 类名称一般以“C”开头,以区别于其

15、他标识符。如 class CPen ,2. 定义类,除了给出操作名和数据结构外,还必须给出 各个成员函数的实现。 CPen : MemberFunction( ) ,由于不同的类允许有相同名称的成员函数,因此,在类外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用域操作符“ : ”。,2020/8/10,福州大学数学与计算机科学学院,28,3. 类中的数据(又称数据成员)和函数(又称成员函数)分为三种类型,分别由三种访问控制修饰符 public, private, protected 加以修饰。,public: 指定其后的成员是公有的。它们是类与外部的接口,任何外部函数都可以访问公有

16、数据成员和成员函数。,这三种修饰符在类中可以任何次序出现,用于修饰在它们之后列出的成员名字能被程序的其它部分访问的权限。,2020/8/10,福州大学数学与计算机科学学院,29,private: 这一部分称为私有部分。若省略关键字private,则必须紧跟在类名称后声明。类中的数据和函数若不特别声明,都被视为私有类型。,这种类型的数据只允许类本身声明的成员函数对其进行存取,且不能被继承。,class CPerson char name; public: int age; float height; void PrintAge(); void PrintHeight(); ;,2020/8/10

17、,福州大学数学与计算机科学学院,30,3.2 对象的定义 对象是类的实例。 对象可以在声明类时直接定义,也可以在声明类之后单独定义。,class CPerson zhang ; 或 class CPerson ; CPerson zhang ;,protected:保护类型,这种类型的数据也只能被类本身的成员函数访问,但可以被派生类继承。,2020/8/10,福州大学数学与计算机科学学院,31,通过对象可以访问类中的公有类型数据和成员函数,其使用方式为: 对象名 . 成员函数名 对象名 . 数据成员,例:zhang . age = 20; zhang . PrintAge( ); zhang.

18、name = “zhang lei “; /error,2020/8/10,福州大学数学与计算机科学学院,32,通过指向类类型对象的指针访问类的公有数据成员和成员函数时,其使用方式为: 指针名 - 数据成员 指针名 - 成员函数,例:CPerson *pWang; pWang - age = 30 ; pWang -PrintAge( );,类和对象的关系就如同整型 int 与整型变量 i 之间的关系。,2020/8/10,福州大学数学与计算机科学学院,33,3.3 类的成员,3.3.1 构造函数 构造函数是一个特殊的类成员函数,用于初始化类变量或分配内存空间。当用类定义一个对象时,自动调用构

19、造函数,使对象保持一个确定的状态。,1. 构造函数的声明 class CExample int I ; public: CExample( ) ; ;,2020/8/10,福州大学数学与计算机科学学院,34,2. 构造函数的特点 (1) 构造函数与类必须具有相同的名字。,例:class CExample CExample ( ) ; CExample ( int i ) ; CExample ( int x , int y ) ; private : int member1, member2 ; ;,(2) 创建对象时自动执行构造函数,构造函数不能在程 序中被显式调用。,(3)构造函数不需要函

20、数类型,不能被继承。,(4)构造函数可以接受参数并能够重载。,2020/8/10,福州大学数学与计算机科学学院,35,CExample : CExample ( int i ) member1 = i ; member2 = 0 ; ,int main( ) CExample ex1; CExample ex2(1); CExample ex3( 2, 3 ); ,CExample : CExample ( ) member1 = 0; member2 = 0; ,CExample : CExample ( int x , int y ) member1 = x ; member2 = y ;

21、 ,2020/8/10,福州大学数学与计算机科学学院,36,(5) 若程序没有为一个类定义任何构造函数,则编译器 生成一个不带参数的公有构造函数,这个构造函数 什么也不做,称为缺省构造函数。 例:CExample : CExample ,3.3.2 析构函数 析构函数与构造函数功能相反,也是类成员函数,通常用于释放已分配的内存空间或完成对象被清除前的一些清理工作。,2020/8/10,福州大学数学与计算机科学学院,37,class CExample public: CExample( ); void Print ( ); CExample( ); ;,析构函数的特点:,1.与构造函数具有相同的

22、名字,前面必须加上“” 符号。,2.析构函数没有函数类型,不能被继承。,2020/8/10,福州大学数学与计算机科学学院,38,3.3.3 内联函数 在函数定义前加上一个inline前缀,该函数就被定义成一个内联函数。,3.析构函数不能带有参数,而且不可以重载。,4.析构函数在 结束时被自动调用。,2020/8/10,福州大学数学与计算机科学学院,39,3.3.5 对象与成员函数,成员函数的参数和返回值不仅可以是整型、字符型、指针类型等,也可以把对象作为参数和返回值。,class CPoint float x, y ; public: CPoint ( float a, float b );

23、CPoint Add ( CPoint A ); ,2020/8/10,福州大学数学与计算机科学学院,40,CPoint : CPoint ( float a, float b ) x = a ; y = b ; ,CPoint CPoint : Add ( CPoint A ) CPoint B; B.x = x + A.x ; B.y = y + A.y; return B; ,2020/8/10,福州大学数学与计算机科学学院,41,3.4 this指针,this指针是一个隐含于每个类的成员函数中的特殊指针。 this用于指向以该成员函数所属类定义的对象。,当某个对象调用成员函数时,成员函

24、数的this指针便指向该对象。因此,当不同的对象引用同一个成员函数时,编译器就依据成员函数 this 指针指向的不同对象来确定引用哪一个对象的数据成员。,2020/8/10,福州大学数学与计算机科学学院,42,例:,#include class A public: A( ) a=b=0; A(int i, int j ) a=i;b=j; void copy(A ,void A : copy(A ,void main( ) A a1,a2(3,4); a1.copy(a2); a1.print(); ,2020/8/10,福州大学数学与计算机科学学院,43,3.5 const关键字,3.5.2

25、 const 的特点及使用注意事项,3.5.1 声明语法 const 是一个类型修饰符,语法是: T const 其中,T是一个类型表达式。 const 与 T 之间的关系是左结合的。,1. 使用const 声明的对象不能被更新。,2. 由于这种对象不能被更新,因此必须进行初始化。 int const a = 2 ; a = 1 ;/ error,2020/8/10,福州大学数学与计算机科学学院,44,3. const 常被用于声明函数的形参。指针类型或引用类型的形参使函数可以更新调用者中的对象,但若函数并不更新指针所指向的对象或引用所引用的对象,那么最好将这样的参数使用 const 关键字进

26、行声明。,4. 当T是一个简单的类型名时,习惯上写作 const T 。 例: const int x = 0 ;,void Print( ) const; /类的常成员函数,5. 对于类中不更新对象的数据成员的成员函数,可以将其使用const进行声明。 当一个成员函数使用const进行声明后,就表明这个函数可以操作常对象。没有使用const关键字进行声明的成员函数则不能操作常对象。,2020/8/10,福州大学数学与计算机科学学院,45,6. 由于const对象必须初始化且不能被更新,因此,当类中声明了const数据成员时,只能通过成员初始化列表来构造该数据成员。,例: class CExa

27、mple public: CExample ( int x ) ; private: const int a ; ; CExample : CExample ( int x ) : a( x ) ;,在类中声明静态的const数据成员时, class A private: static const int SIZE ; const int A : SIZE = 10 ;,2020/8/10,福州大学数学与计算机科学学院,46,3.6 友元函数,3.6.1 定义 友元函数是一种特殊的函数,它不是类的成员函数, 但允许它访问类的私有类型数据和保护类型数据。,3.6.2 声明方式 class 类名称

28、/相关的类 type vars ; public: friend 函数类型 函数名称( ) ;/声明友元 函数类型 函数名称( ) /定义友元 ,2020/8/10,福州大学数学与计算机科学学院,47,3.6.3 特点 1. 友元可以是一个一般的函数 (友元函数),也可以是另一个类的成员函数 (友元成员),还可以是整个的一个类 (友元类,这时类中的所有成员函数都是友元函数)。,2. 友元函数须在私有成员可被它访问的类中声明,而函数体则在类外声明。,3. 友元函数虽然在类中声明,但它不是该类的成员函数,而是独立于任何类的一般的外界函数,它被允许访问该类的所有对象的私有成员。,4. C+中使用友元

29、是为了提高程序的运行效率。但为了确保数据的完整性及数据封装与隐藏的原则,应尽可能不使用或少使用友元函数。,2020/8/10,福州大学数学与计算机科学学院,48,3.7 引用 引用是给对象取一个别名,它引入了对象的一个同义词。,注意: (1)引用不产生对象的副本,而是对象的同义词,它们表示同一个对象。,(2)定义引用时,必须马上对它进行初始化,不能 定义完后再赋值。,2020/8/10,福州大学数学与计算机科学学院,49,(3)对对象或对引用的任何操作都会影响到它们共同的对象。,3.7.2 引用的使用 引用参数引用可以用在需要改变实参变量的函数中;,#include void swap( in

30、t x, int y ) int temp ; temp = x ; x = y ; y = temp ; ,(4)引用一旦被初始化,就不能被改变,也不能更新引用, 使其标识另一个对象。,2020/8/10,福州大学数学与计算机科学学院,50,运行结果: a = 1 b = 2 a = 1 b = 2,main ( ) int a = 1, b = 2 ; cout “a = ” a “b = ” b endl ; swap ( a , b) ; cout “a = ” a “b = ” b endl ; return 1; ,若要使a、b的实际值交换,swap 函数应定义为: void swap( int ,double max(double x, double y) return xy ? x : y; ,template T max(T x, T y) return xy ? x : y; ,int i=max(1,2); double x=max(1.0,2.0);,2020/8/10,福州大学数学与计算机科学学院,52,3.9 运算符重载 为用户定义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论