


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一章 概论C+程序的基本元素:关键字、标识符、运算符、标点符号1.1 算法、程序和语言1.1.1 算法和程序 算法:对数据处理操作的步骤。1.1.2 低级语言和高级语言 机器语言:由二进制码组成的指令。 汇编语言:用助记符来表示每一条机器指令。 高级语言:与人类习惯语言相近的程序设计语言。1.2 面向过程和面向对象的程序设计1.2.1 面向过程的程序设计1.2.2 面向对象的程序设计1.3C+程序的写出和运行1.3.1C+程序简例main ()是主函数。程序总是从 main函数开始执行。原型: main(int argc,char *argv) 标识符:给变量等实体所取的名字统称为标识符,只
2、能以下划 线或字母开头关键字:C+中具有特定含义的词语句:程序中语句要用“; ”结尾,分号是语句的组成部分。1.3.2C+程序从写出到运行几个步骤 源程序(.cpp):用C+语言写出的程序。程序代码 (.obj) :源程序经过编译程序翻译,成为用机器语言 表示的目标程序。可执行文件( .exe ):把各个相关文件链接起来形成的文件。第二章 基本数据、别名和指针2.1 基本数据 数据是程序处理的对象而存储于内存空间中。 存间的大小与数据类型有关,数据类型分为基本数据类型和导 出数据类型2.1.1 基本数据类型数据类型:基本数据类型、导出数据类型 基本数据类型:字符型、整型、实型、双精度型、无值型
3、 导出数据类型:数组、指针、结构体、共用体、类、枚举 整型:计算机内部是以二进制补码形式表示 字符型: ASII 码有128个字符,0-31 和128为不可见字符(控制字符)浮点型:小数形式、指数形式数据类型存间(字节)长度(位)取值范围字符 char unsignedchar 整数短整型 shortUnsignedshort1 81 82 162-1281270225-327683276716 065535整型 int4 32-2 31(231-1 )长整型long43231-2 (231-1 )Unsignedlong4320(232-1)实数 float432 -3.4x 10-383.
4、4x381038Double864 -1.7x10-3081 .7 x 10308Longdouble864 -1.7xUnsignedint4320(232-1)10-3081.7 x 103082.1.2 数据变量的存间、长度和取值范围 数据变量的存间:储存变量的内存空间。整数存储安置规则:变量值的高位字节存于高地址的内存单元 中,低位字节存于低地址的内存单元中。存间长度运算符: sizeof (某变量类型)变量的长度:变量的字节数x 8二变量值的二进制位数。2.1.3 数据变量的表示整数的表示:八进制:以 0 开头。十六进制:以0x或0X开头后缀 L 或 l 为 long 型;后缀 U
5、或 u 为 unsignedint 型;同时后缀 L 和 U 为 unsignedlong 型。实数的表示般形式: 科学计数法:0.75e+9表示0.75 x 109,小数点前留一位为标准科学 计数法; E 可大写可小写,前后必须有数字。后缀 F 或 f 为 float 型,无后缀默认为 double 型。 字符的表示:对于可以通过键盘输入的、可显示的字符,可用单引号 阔气来;对于不可以通过键盘输入的,不可显示的字符,用转义字符 ';对 ASCII 码中任一字符, 都可用反斜杠后跟一个八进制或十六 进制数用单引号括起来表示 101 '和 x41 '都表示字符 A。 字符
6、可以对整型变量赋值, ASCII 码范围内的整数也可以对字符型变 量赋值,字符进行运算时,以其 ASCII 码值参与运算。2.1.4 字符串常量及其值 字符串常量是用一对英文双引号括起来的不可改变的字符序 列。2.1.5 数据变量的声明和赋值2.1.6 数据变量的访问2.2 别名2.2.1 别名变量概念2.2.2 别名变量的声明2.2.3 用别名对变量进行访问2.3 指针2.3.1 地址概念2.3.2 指针变量概念2.3.3 指针变量的声明和赋值2.3.4 用指针对变量进行访问C+动态内存分配:new类型名(初始值列表)/开辟存储类型空间new类型名下标表达式1下标表达式2/创建储存数组的空间
7、new类名(初始值列表)/创建对象如果内存开辟失败,对应指针应该为NULL这是判断内存是否成功被开辟的标志:int *pnValue;pnValue=new int(3);if(pnValue=NULL)exit(0); 开辟空间后一定要保持指针始终指向给内存 对于动态数组中的操作:一是利用下标操作,二是另外声明一 个指针来遍历数组。动态内存开辟后,最好进行初始化:memset指针名,初始值,开辟空间的总字节数); sizeof(*p) 计算出的是指针所占内存的大小,并不是指向内存 空间的大小利用 delete 释放指针后将指针置为 NULL;delete plArray;plArray=NU
8、LL;C风格的动态内存分配方法:开辟动态内存 malloc 函数: void*malloc(size_t size)包含头文件: <stdlib.h> 、 <malloc.h> size_t 是需要分配内存的字节数如果开辟内存成功, 返回 void 类型指针; 如果失败返回空指针 如果需要的不是 void 类型内存空间,需要进行强制类型转换 释放函数 free : voidfree(void *pointer);函数间的动态内存传递: 利用引用类型参数传递动态内存 ( 推荐使用 ) : voidGetMen(char* &p,size_t size); 利用二级
9、指针参数传递动态内存: voidGetMen(char *p,size_t size); 利用函数返回至来传递动态内存 char*GetMen(size_t size);2.3.5 二级指针变量概念2.3.6 使用指针要特别注意指针的指向 浅复制容易产生野指针,深复制会产生大量资源 智能指针2.4 对数据变量的保护2.4.1 用 const 声明常值数据变量#define 宏定义(预处理命令) :#define 常量名 值const 数据类型 变量名 = 常值数据类型 const 变量名 = 常值常量的值保持不变,不允许再赋值2.4.2 在声明中用 const 对指针变量进行限定 声明常值指针
10、变量:数据类型 *const 指针变量名 = 常地址; 指针变量的值保持不变,指向恒定声明只读指针变量: const 数据类型 * 指针变量名; 指针所指只可读不可写声明常值只读指针变量: const 数据类型 *const 指针变量名 = 常地址;2.4.3 在声明中用 const 对别名变量进行限定 声明只读别名变量: const 数据类型 &别名变量名 = 变量名 第三章 数据的运算和简单的输入输出运算3.1 运算符和表达式运算符优先级:圆括弧是一级优先二级优先全是单目运算符,可称单目块 35级可称为加减乘除块。其中左右位移运算相当于乘和除6、 7 级优先可称为关系块812级优先
11、可称为逻辑块,其中 810 是按位逻辑块 1315优先级可称为条件、赋值、逗号块3.2sizeof ()运算符和 sizeof ()表达式3.3 算数运算符和算数表达式3.4 关系运算符和关系表达式3.5 逻辑运算符和逻辑表达式3.6 位运算符和位运算表达式3.7 条件运算符和条件表达式3.8 赋值运算符和赋值表达式3.9 逗号运算符和逗号表达式3.10 基本数据混合运算是数据类型的转换3.10.1 隐性类型转换赋值运算中的隐性类型转换如果有操作数长度长,而左操作数长度短,赋值时按低位优先 的原则将右操作数赋入左操作数存间, 存间装满为止, 剩下的高位 数被舍弃。3.10.2 强迫类型转换语法
12、形式:类型说明符(表达式) ;(类型说明符)表达式; (类型说明符)(表达式)3.11 指针的增减运算3.12 简单的输入输出运算3.12.1 输入流和输出流3.12.2 提取运算符 >>和插入运算符 <<3.12.3 提取表达式和插入表达式3.12.4 基本数据的输入和输出字符串的输出想要输出一条字符串,只要将字符串的首字符指针作为插入运 算符 <<的右操作数就行:cout<< ”dkfjs ”;/ 双引号括起来的字符串可以看做是一个字 符串表达式,字符串表达式的值就是字符串的周字符指针char*p = “skdjf ”;cout<<
13、;p;3.13 简单输入输出的格式控制3.13.1 输入/ 输出的默认格式 整数按十进制数出实数按十进制浮点输出,有效数字 6 位当实数的整数部分大于或等于 7 位时,则转化为科学计数法输 出。当小数点后连续有 4 个或 4个以上零,则转换为科学计数法输 出以上输出宽度(域宽所占字符数)均默认为0,靠右对齐若实际输出字符大于域宽时,按实际字符输出3.13.2 用格式控制符对格式进行控制 控制项目控制符功能有效期 进制 dec 输入或输出整数时用十进制表示长效Hex输入输出整数时用十六进制表示长效iostream0ct 输入输出整数时用八进制表示长效换行 endl 输出时换行并进行刷新短效 无域
14、宽 setw(int) 出数据的域宽,靠右 短效显示余项空格填充iomanip填充 setfill(char) 对输出域余用字符填充 长效精度 setprecision(int) 设置实数输出精度 长 效第四章 程序的流程控制4.1 程序流程的基本结构4.2 选择结构语句4.3 循环结构语句4.4 其他控制语句和函数4.4.1break 语句4.4.2continue 语句4.4.3goto 语句4.4.4abort 函数和 exit 函数Abort函数和exit函数都是C+标准库cstdlib 中的两个函数。Voidabort ()Voidexit (intstatus )这两个函数的作用都
15、是终止整个程序的运行,将控制返还给操作系统。但前者仅仅结束程序的运行,不做任何善后工作。而后者在终止前做些收尾工作,例如关闭打开的文件、写完缓冲 输出的内容、收回变量存间等。参数 status 置 0 表示正常退出, 置 1 则表示异常退出第五章 函数5.1 函数的概念5.1.1 函数的概述5.1.2 函数的定义当返回值的类型为 int 型时,可省略标识符5.2 对函数的调用5.2.1 被调函数的函数原型声明 函数原型声明中的形式参数表,只要求按函数定义中各形参的 类型、次序、个数写正确就行,至于形参的名称不写甚至写错 也不要紧。5.2.2 函数的调用5.2.3 函数调用流程三步骤:中断、转移
16、、返回。 在中断时,把当时的现场数据和地址储存起来。在返回时把现 场数据和地址取出。根据这地址就能精确的回到原流程处5.2.4 函数的递归调用 要形成函数的递归调用,这递归关系和递归终止条件二者缺一 不可5.3 函数内外变量的作用域和生存期5.3.1 作用域 函数内的块作用域:用花括号括起来的部分称为一个块,在块 内声明的变量,其作用域开始于变量的声明处,结束于块的结 尾处。在同一作用域内,不能声明同名变量 在没有互相包含关系的不同的作用域中,允许声明同名变量。 它们各在各的作用域内使用,互不干扰。在互相间又包含关系的作用域中, 也允许声明同名变量。 不过, 在使用同名变量时,在被包含的内层作
17、用域中,只能使用内层 作用域所声明的同名变量同时自动覆盖掉外层的同名变量。或 者说,在内层中,对外层的同名变量是不可见的。这种情况也 可简称为“内层同名优先” 。和 for 语句有关的作用域:若在 for 语句的圆括弧内声明了某变量, 则该变量就如同在 for 语句所在的作用域内声明一样,该变量作用域从声明处开始至 for 语句所在作用域结束为止。若在 for 语句的循环体内声明了某变量,则该变量的作用域就 只在循环体范围内,作用域从声明处开始至循环体结束处为止。 文件作用域: 在所有函数值为所声明的变量称为全局变量。全局变量的作用 域是从声明处开始到文件结束处为止。这个作用域称为文件作 用域
18、。 如果要在局部变量的作用域内访问与局部变量同名的全局变 量,则可在同名变量前加域运算符“: :”来进行访问。5.3.2 生存期 静态生存期:从变量的作用域开始,变量因系统配给空间而开 始存活。如果在作用与结束时,存间未被收回而仍然占用着。 要一直等到主函数结束时,也就是整个程序结束时,系统才收 回该变量的存间,从而使该变量消亡。对于局部变量,若在其声明语句的类型前面加 static ,则该变 量的生存期就是静态生存期。变量就是静态变量。 对于全局变量,无需加 static ,他天生就是静态变量。因为他 本来就是从声明处开始获得存间而存活,直到主函数结束,存 间才被收回而消亡 静态变量必须在声
19、明语句中设置初值。如未设置初值,则系统 会自动设置初值 0。静态变量的声明语句只执行一次。5.4 函数内外的数据传递5.4.1 函数通过参数进行数据传递 参数的别名传递:访问别名变量于被调函数之内,效达实名变 量于主调函数之中。(双向传递) 参数的地址传递:访问指针所指于被调函数之内,效达所指变 量于主调函数之中。(双向传递) 参数的值传递:主调函数将数据传递给被调函数。 (单向传递)5.4.2 具有默认值的参数传递具有默认参数的函数: 默认参数的说明必须出现在函数调用之前,不可重复说明。 参数的默认值可以使表达式,但表达式必须有确定的值。 默认参数可以有多个,但必须在参数表中靠右边排列。 同
20、一个函数在不同的作用域内, 可提供不同的默认参数值。(在 不同作用域中进行声明)5.4.3 函数通过返回值进行数据传递 返回一个基本数据值 返回一个静态变量的地址: 静态变量延长了变量的生存期,但作用域并未改变。所以可以 通过访问指针所指,来访问变量名失效的静态变量 返回一个静态变量的别名: 在主调函数中,函数调用式可作为该静态变量的别名来使用5.4.4 函数通过全局变量传递数据 除非特别需要,一般不使用全局变量5.5 内联函数和函数的重载 内联函数(在定义函数时,在前面冠以关键字 inline ): 内联函数也应该定义在前,使用在后。在C+中,除函数体内含有循环、switch分支和复杂嵌套的
21、if 语句外,所有函数均可定义为内联函数。用户确定函数的内联,只是一个“内联”的建议。到时候是否 真的照“内联”执行,要由编译器决定。函数重载: 形参类型不同;形参个数不同。5.6 用指针对函数进行操作处理5.6.1 函数指针函数地址:首内存单元地址叫做函数的入口地址,简称为函数 地址函数名就是函数地址 函数指针变量:专门用来存放函数地址的变量。5.6.2 函数指针的声明和赋值 声明一个函数指针变量时, 需要说明所指函数的类型和形参表。 一般形式:数据类型( *函数指针名)(形参表); 函数指针变量的初始化和赋值:Doublefun ( int ,int ,double );Double(*p
22、)(int ,int ,double ) =fun ;Doublefun ( int ,int ,double );Double(*p)(int ,int ,double );P=fun;Double fun (int ,int ,double ),(*p)(int ,int ,double ) =fun;5.6.3 用函数指针调用函数 用函数指针调用函数的形式和用函数名调用函数的形式是一致 的,只不过是把函数名换成函数指针名:函数指针名(实际参数表);5.6.4 用通用函数处理函数 主函数以具体函数的地址为实参调用通用函数,而通用函数则 以同类型函数指针变量作为形参,来接纳具体函数的地址。5
23、.7 函数的多文件组织5.7.1 模块化程序设计 模块化程序设计:自顶而下,逐步细化,模块化。5.7.2 原文件之间的访问 源文件之间对全局变量的访问:如果本文件中所声明的全局变 量属本文件私用,不允许别的文件访问,则必须在全局变量类 型前加修饰词 static 。如果本文件要用到别的文件中允许访问的全局变量,则本着先 声明后使用的原则,应先照原样做变量声明在声明前加修饰词 extern 。原文件之间对函数的访问:与全局变量类同。不允许别的文件 访问,在原型声明前加 static ,使用其他文件中可以访问的函 数,做原型声明,并在前加 extern5.7.3 头文件头文件:将函数原型和全局变量
24、(加 extern 修饰)集中起来, 还有一些常数定义,放在一起写成一个文件,供各个相关的源 文件使用5.7.4 多文件组织的编译和链接包含文件:在定义main函数的源文件中,将组成同一程序的其 他文件用包含指令( #include )包含进来。由编译程序对这些 文件一起编译,并链接成一个可执行文件。工程文件的方法:将组成一个程序的所有文件都加到工程文件 中,由编译器自动完成多文件组织的编译和链接。5.8 编译预处理5.8.1#include 指令 又叫文件包含指令。 使用:执行时将所指定的文件嵌入到该语句处,替换该语句。 可嵌套使用。形式:#includev文件名 >:用于包含C+库函
25、数头文件。搜索该文件时系统直接到存放C+库函数头文件所在的目录中查找所要包含的文件,这叫按标准方式搜索文件。#include ”文件名”:用于包含用户自己编写的头文件。 系统先在当前目录中搜索该文件,若搜索不到,再按标准方式 进行搜索。5.8.2#define指令#define 指令(宏指令): #define 宏名 宏定义内容 宏名常用大写字母表示; 可以出现在程序中的任何位置,一般放在原文件开头; 在宏扩展时,只是用原封不动的宏定义内容来替换宏名;当宏名出现在字符串中时,编译预处理对宏名不进行宏拓展#undef指令(终止宏指令):#undef 宏名终止宏的作用域5.9条件编译以宏名已被定义
26、或未被定义作为条件#ifdef程序段#en dif宏名#ifdef宏名程序段1else程序段2#en dif#ifndef宏名程序段#en dif#if ndef程序段1else程序段2#en dif以表达式逻辑为1或0作为条件#if表达式程序段#en dif #if 表达式程序段1else程序段2#en dif关于条件编译的说明表达式必须有确定的值,只能是常量的运算。可以出现在程序中的任何位置。第六章数组6.1 一维数组6.1.1 一维数组的声明及初始化对一维数组元素的直接访问用一维数组名对元素进行访问一维数组名既是整个数组之名同时又是数组首元素之地址。数组名不是变量,系统不配给它变量存间。
27、因此对数组名不能 作赋值、自增或自减等涉赋运算,不能进行自增或自减走步。用指针变量对一维数组元素进行访问用元素指针变量做被调函数形参用一维数组做被调函数形参:Voidfun (doublex8 );Voidfun (doublex , intn );Voidfun (double*x , intn );6.1.5 用数组名实参调用函数对一维数组进行处理6.2 二维数组6.2.1 二维数组的声明及初始化6.2.2 对二维数组元素的直接访问6.2.3 用二维数组名对元素进行访问 二维数组名是首行地址,是指向首行的指针。所指目标是行, 所以是按行走步的,走的是行步。各行的数组名是各行的首元素地址,所
28、指目标是元素,所以是 按元素走步的。实际是按列走步,走的是列步 *(*(b+i)+j )等价于 bij 系统不作为变量配给存间,不可做赋值、自增或自减运算。 二维数组的首元素地址可表示为: &b00 、 &b0 、*b6.2.4 用指针变量对二维数组元素进行访问 元素指针变量:指向元素的指针,按元素走步。二维数组名是首行指针按行走步,元素指针变量按元素走步。 所以,不能直接用二维数组名对元素指针赋值 int b35;int *p;p=(int*)b;实在要赋值,必须先按指针的类型进行强制类型转换*(p+n*i+j) 等价于 bij一维数组指针变量: 数据类型( *指针变量名)
29、常量表达式(与 二维数组列数相等) 可以用二维数组名直接赋值6.2.5 用首元素地址或数组名作实参调用函数对二维数组进行 处理效果直达主调函数6.3 关于字符串的处理6.3.1 字符串的输入和输出 用一维数组对字符串逐个字符输入和输出:采用循环语句 用“cin>> ”和“coutvv ”对字符串进行输入和输出:只需给出 数组名无法输入空格用函数 cin.getline 对字符串进行输入: cin.getline( 首地址, 长度)6.3.2 用一维字符串数组处理字符串用字符串初始化一维字符数组:采用逐个字符初始化时,末尾 加 0 ';字符串整体初始化: char s220=
30、 “a sting ” ;Char s320 =“a string ”;6.3.3 用库函数处理字符串头文件: cstring复制: char *strcpy(char x,char *y)将 y 复制到 x 中拼接: char *strcat(char x,char *y) 26.4 关于字符串组的处理6.4.1 用二维数组处理字符串组6.4.2 用一维字符指针数组处理字符串组6.4.3 用一维字符指针数组名做实参调用函数处理字符串组6.5 动态配给存间6.5.1new 运算符的用法同类型指针变量=new 类型名;同类型指针变量=new 类型名(初值);同类型指针变量二new类型名兀素个数;
31、同类型指针变量= new 类型名 行数 列数配给成功返回存间地址;配给失败返回空指针 0; 6.5.2delete 运算符的用法delete 指针名delete 指针名delete 行数 指针名 第七章 枚举类型和结构类型7.1 枚举类型7.1.1 枚举类型概念枚举类型:取值范围只局限在某些数据组成的集合之内的变量。枚举类型的定义:en um枚举类型名(枚举兀素列表)枚举元素又叫枚举值或枚举常量枚举元素的整型值: 枚举元素具有整形值,若不另行设置,枚举元素的整型值依次 默认为0、1、2、3。设置整型值:Enumweekday sunday=7,Monday=1,Tuesday,Wednesda
32、y,Thursday ,Friday , Saturday;对于Monday以后的枚举元素的值未设置,系统会按顺序逐个加1在数学运算时枚举型数据会自动转换为整型值参与运算。7.1.2 枚举变量的声明和赋值 枚举变量的声明:枚举类型名 枚举变量名; 枚举变量既已声明系统会对枚举变量配给 int 型存间,每个枚 举变量存间占四个内存单元声明的三种方法 :在定义枚举类型以后,另行声明; 在定义枚举类型的同时进行声明; 在定义枚举类型时,不取枚举类型名,直接声明枚举变量 赋值: 可以用枚举元素对枚举变量进行赋值。同类型枚举变量也可以相互赋值。不能直接赋整型值,要经过强制类型转换;具有整型值可参与数值运
33、算,不可进行涉赋类运算,必要时先 进行强制类型转换;枚举类型是标识符,不能直接输入输出,只能输入整型值,输 出对应字符串;对枚举类型进行输出时,显示整型值。7.1.3 调用函数对枚举变量输入和输出通过 switch 语句实现7.1.4 枚举元素的组合状态枚举元素标识位:枚举元素整型值按 2 的倍数递增,使所有枚举元素都有一个各自专用的二进制位枚举元素组合的状态字: 可用一个整数 flag 来表明元素组合状态。计算时,个元素的整型值按位或运算求得 flag 值7.2C+用格式状态字表示输入输出格式的组合7.2.1 将各个输入输出格式定义为各个枚举元素这些枚举元素是C+在 iOS域中定义的,使用时
34、,应该加域运算符“ ios :”。7.2.2 用格式状态字 flag 表示多项格式组合状态格式状态字 flag :多项格式整型值按位或7.2.3 用格式状态字通过格式控制符对多项格式的组合进行控制setiosflags ( intflag )设置格式状态字 flag ,表明格式组合状态resetiosflags ( intflag )终止 setiosflags ( intflag )的设 置7.3 结构类型7.3.1 结构类型的定义 一般格式: struct 结构类型名 数据类型 1 成员变量 1 数据类型 2 成员变量 27.3.2 结构类型变量的声明、初始化和赋值 结构类型变量所占空间:
35、理论上是各个成员存间之和。但实际 上为了提高对内存的存取速度,分配给各个结构成员的内存空 间以字( 4 字节为单位),以保证其地址在字的整数倍处。 初始化:在大括号中,将所有成员之值依次排列,相互用逗号 隔开静态成员: 必须在结构体类型创建对象之前为静态成员设置初值: 数据类型 结构体类型 : 静态成员 =初值; 静态成员属于结构体,所有该结构体类型的变量共享静态成员7.3.3 对结构类型变量的成员进行访问 一般形式:结构型变量 . 成员名7.3.4 结构类型数组7.4 链表7.4.1 链表的组成7.4.2 如何表示节点成员变量7.4.3 对链表结点的操作7.4.4 插入节点7.4.5 建立有
36、序新链表7.4.6 输出链表各节点的数据7.4.7 删除结点7.4.8 释放链表7.5 用 typedef 来定义某类型的又一个标识符7.5.1 方法步骤typedef 类型名 类型名别名先按声明变量的方法,写出声明语句: int (*p )();函数指针 将变量名换成想要定义的标识符: int (*POINTER)(); 在最前面加 typedef第八章 类和对象8.1 概述8.2 类8.2.1 类的定义8.2.2 对类内各成员访问的控制规则8.2.3 类的引用性声明8.2.4 面向对象程序设计的多文件组织8.3 对象8.3.1 对象的声明8.3.2 对象的初始化8.3.3 同类对象之间的整
37、体赋值8.3.4 访问对象的数据成员和成员函数8.3.5 指向本对象的 this 指针8.4 构造函数8.4.1 构造函数的作用特点和定义形式8.4.2 对构造函数的两点说明8.4.3 拷贝构造函数的作用特点和定义形式C+会自动生成复制构造函数和赋值操作符重载当对象中含有指针,涉及动态分配空间时,必须要重新定义:C+自动产生的复制构造函数会将对象中的指针直接赋值给新建对象的指针,我们应该将指针中的地址赋值给指针:先得到 指针,然后取指向内容,然后动态分配内存空间,把得到的地 址赋值给指针844构造函数和new运算符深复制和浅复制自动生成的复制构造函数为浅复制 浅复制时只复制指针不复制指针所指内
38、容,两个指针指向同一 个存间的内容,这个存间的内容改变时,两个指针指向内容都改变 深复制时对指针所指内容也进行复制,两个指针指向不同,但 指向存间的内容相同:改变存间的内容只会影响一个 在复制时创建新的存间然后将原内容复制过来8.4.5 默认的构造函数和拷贝构造函数8.5 析构函数8.5.1 析构函数的作用特点和定义形式 如果自定义了析构函数,就必须自定义复制构造函数和赋值操 作符重载 如果构造函数进行了动态分配内存,连接了数据库,打开了文 件,就必须自定义析构函数来关闭这些8.5.2 默认的析构函数8.6 类的静态成员8.6.1 静态数据成员 静态数据成员:描述类属性的数据作为类的数据成员,
39、前面要 用关键词 static 进行修饰。静态成员不属于对象,而属于类。 静态数据成员的声明: 在类的定义中只要冠以 static 修饰做引 用性声明。在类的定义中不可初始化静态数据成员,在类的定 义外用域运算符做一个正式声明:类型 类名:静态数据成员名; 或 类型 类名:静态数据成员 名=初值;正式声明时分配存间。特例:静态整形常量可以在声明时赋值staticconstint 变量名 = 常值; 在类内对静态成员的访问,和其他成员一样,不管是公有还是 私有所有成员函数都可访问它。类外对公有静态成员的访问:通过对象名直接访问;通过类名 直接访问。类外对私有静态成员的访问: 设置属于类的公有静态
40、成员函数, 作为类属对外的接口。8.6.2 静态成员函数 静态成员函数中不能使用 this 指针: this 是指向当前对象的指针, 而静态成员属于类, 与对象无关8.7 类的友元8.7.1 友元的概念8.7.2 运用友元的一个问题8.7.3 友元声明的一般形式8.7.4 关于友元的几点说明8.8 类的嵌套8.8.1 类嵌套的关系8.8.2 嵌套类构造函数的定义和调用8.8.3 嵌套类构造函数的定义形式第九章 继承与派生9.1 继承与派生的基本概念9.1.1 继承、派生、基类、派生类的概念9.1.2 积累和派生类的构成形式多脉继承和单脉继承多级继承多脉多级混合继承9.1.3 派生类成员的组成和
41、身份的确定派生类成员的组成:构造函数和析构函数、原基类成员组、新 增成员组。作用:原基类成员组体现了派生类继承了基类的全部特征和功 能;新增成员组体现了派生类在功能上比基类有所发展;派生 类在新增成员中,可设置与原基类成员同名的成员特别是同名 的成员函数,其函数体可以有所不同。这体现了派生类可以对 所继承的基类的特征和功能加以改进。9.2 派生类9.2.1 派生类的一个简例9.2.2 派生类的定义形式Class 派生类名:继承方式 基类名 1,继承方式 基类名 2 Private :私有成员Public :公有成员9.2.3 派生类成员、存间及身份具体确定9.2.3 派生类的构造函数和析构函数
42、9.3 对派生类中同名成员的二义性的处理9.3.1 类名加域运算符: :处理法 派生类内访问同名成员: 类名 : 数据成员 类名 : 成员函数名(参数表) 派生类外对对象访问同名成员: 派生类对象名 . 类名: 数据成员名 派生类对象名 . 类名: 成员函数名(参数表) 派生类外对对象指针访问同名成员: 派生类对象指针名 -> 类名 : 数据成员名 派生类对象指针名 -> 类名 : 成员函数名(参数表)9.3.2 同名覆盖原理 访问派生类中新增同名成员:通过对象直接访问9.3.3 对共同基类经多级多脉继承发生同名成员的处理 类名加域运算符9.3.4 用虚基类避免一个数据多种版本问题
43、 一个数据多个版本来历: 当派生类含有两个或多个从一个共同基类派生而来的基类时, 派生类在继承时,就会使共同基类的成员在此派生类中有多个版本措施: 在定义共同基类的直接派生类时,在共同基类的继承方式前加 关键字“ virtual ”。把共同基类设置为虚基类。class 共同基类直接派生类名 : 继承方式 共同基类名 virtual 只对紧跟其后的基类起作用 对于虚基类,所有直接和间接派生类的基类初始化列表中都必 须包含对虚基类的初始化列表。或者,虚基类的构造函数中必 须由默认值当定义某派生类时,只有该派生类对虚基类构造函数进行调用 (只调用一次)9.4 类的赋值兼容9.4.1 共有派生类对象可
44、以顶替基类对象 公有基类成员经共有派生,仍然是公有身份,可直接访问9.4.2 共有派生类对基类的赋值兼容 公有派生类对象可以赋值给基类对象 公有派生类对象地址可以给基类指针初始化或赋值 公有派生类对象可以初始化基类别名9.4.3 对一个程序运行结果的思考 对公有派生类中基类成员的操作9.4.4 类的赋值兼容规则的实质第十章 多态性10.1 虚函数10.1.1 虚函数的声明virtual 函数类型 成员函数名(形参表) ; 基类中虚函数一经声明,所有派生类中的同名成员函数,都为 虚函数。构造函数、静态成员函数和友元函数都不可声明为虚基类 一般来说,积累成员中有虚函数,则基类析构函数也应声明为 虚
45、函数,声明后派生路径上所有派生类的析构函数都为虚函数。10.1.2 虚函数在实施赋值兼容规则中所起的作用 当基类成员函数声明为虚函数时,在派生过程中可理解为: 对于虚函数,所有新增同名成员会对其进行替换 对于虚函数在赋值兼容规则中,将会用使用同名派生成员进行 赋值10.1.3 虚析构函数 当析构函数定义为虚函数,对于用派生类进行初始化或赋值的 基类,在调用析构函数时,将调用派生类析构函数10.2 纯虚函数和抽象类10.2.1 纯虚函数声明格式: virtual 函数类型 函数名(参数表) =0;纯虚函数无函数体,但派生类中同名函数必须有函数体10.2.2 抽象类 带有纯虚函数的类不能实例化,不
46、能声明抽象类的对象。但是可以声明抽象类指 针和抽象类别名10.2.3 抽象类实例10.3 运算符重载10.3.1 运算符重载概念10.3.2 运算符重载规则 不可重载的运算符:三目运算符(?: )、成员操作( . )、成员 指针操作( * )、域限定( : )、求字节数( sizeof ) 重载的功能应与原有功能相似重载后优先级和结核性不变 运算符操作数个数不变10.3.3 运算符重载函数 函数名: operator 运算符 原型声明:函数类型 operator 运算符(形参表) 一般用成员函数和友元函数实现10.4 用成员函数实现运算符重载10.4.1 用成员函数实现双目运算符重载 做操作数
47、是对象有操作数是形参10.4.2 用成员函数实现单目运算符重载 一般为无参函数对于“+”“- ”前置无形参, 后置时用一个形参 int 以示区别, 但并无实际意义(做函数定义时不提供形参名)10.5 友元函数实现运算符重载10.5.1 用友元函数实现双目运算符重载10.5.2 用友元函数实现单目运算符重载10.6 提取运算符和插入运算符的重载10.6.1 提取运算符和插入运算符对基本数据的重载10.6.2 用友元函数实现提取运算符和插入运算符对自定义类 型数据的重载10.7 对象运算中的类型转换10.7.1 转换构造函数10.7.2 类型转换函数10.7.3 对象运算类型转换第十一章 输入输出
48、流类体系11.1 基本概念11.1.1 流类概念 流类:具有一定模式的数据流并且都有一个出入端口 流:流类的对象流类的属性:模式和端口流的端口: C+用端口名作为端口数据,简称端口。流的模式:针对流的各种情况采取的各种处置方式的组合。采 取枚举元素作按位与的状态字作为模式数据。11.1.2 缓冲流 缓冲区一般大小: 512 字节11.1.3 流类体系11.2 基本流类体系11.2.1 基本流类体系组成11.2.2 基本流类体系各组成部分简介11.3I/O 标准流11.3.1 I/O 标准流概念输入流类对象: cin输出流类对象: cout 、 cerr 、clog标准流的端口和模式输出流类对象
49、中 cerr 为非缓冲流,可做即时输出; cout 输出 端口可重定向; clog 很少用。11.3.3 常用于输入的成员函数intget() ;只从缓冲区提取一个字符(包括空白) ,返回值为提取字符的ASCII码作为返回值,遇到文件结束符(八Z),返回系统常量EOF ( -1 )cin.get();11.3.4 常用于输出的成员函数11.3.5 用于格式控制的成员函数11.3.6 用于检验出错的成员函数11.4 文件流体系11.4.1 文件流类体系组成11.4.2 文件流类体系个部分组成简介11.5I/O 文件流11.5.1 I/O 文件流概念文件流的建立,端口和模式的确定11.5.3 用于
50、建立和关闭 I/O 文件流的成员函数文本文件流常用的成员函数11.5.5 I/O 二进制文件流常用的成员函数第十二章 命名空间、模板和异常处理12.1 命名空间12.1.1 命名空间的定义与使用 定义命名空间的三种形式: 有名字的命名空间的定义与使用namespace命名空间名 >/ 各种成员说明 在命名空间外访问访问成员格式: 命名空间名:命名空间成员C+允许将同一个命名空间中的定义和声明分开在多个文件里 给出,或者分成许多段给出。 嵌套的命名空间的定义与使用C+允许在一个命名空间中定义另一个命名空间,形成多个层次的作用域。当从外部访问内层命名空间中的成员时,需要使用多个作用域运算符
51、无名的命名空间的定义与使用 可以在定义命名空间时省略名字 无名命名空间中说明的标识符, 使用时无法加命名空间名限定, 只能在本文本的作用域内使用,可以取代全局变量的定义:static 类型名 变量名 命名空间取别名:n amespace另"名 =命名空间名;嵌套命名空间的内层命名空间取别名:namespace别名 二外层命名空间:内层命名空间12.1.2 标准命名空间 标准C+库的所有标识符都定义在名为std的命名空间中。在程序中使用标准库时,需要使用 std 限定: std :coutC+标准库分为两类:没有使用命名空间,与C兼容,包含文件的拓展名为“ .h ”;使用命名空间std
52、,不与C兼容,包含文件没有拓展名“ .h ”使用与 C 兼容的标准库#include<cstdio>#include<stdio.h>#include<cmath>#include<math.h>#include<cstring>#include<string.h>using namespace std;使用命名空间 std 的新标 准库12.1.3 用 using 引用命名空间 从外部直接访问命名空间中成员的方法: 命名空间名 +作用域运 算符限定using 语句的两种形式:using 命令: using namespa
53、ce 命名空间名; 当前作用域可直接引用指定命名空间所有成员,但没有将成员 加入到当前作用域using 声明: using 命名空间名 : 成员; 将指定命名空间的指定成员引入到当前作用域,可以直接访问 这个成员。当前作用域不可声明同名成员12.2 函数模板12.2.1 函数模板的概念 函数模板的定义: template<class T1 , class T2> 返回类型函数名 ( 参数表)函数体T 是模板的类型参数, 使用关键字 class 或 typename 定义类型 参数12.2.2 函数模板的使用 隐式:函数名(实参) ;系统使用函数模板的步骤: 编译器根据实参类型,推导
54、出模板实参; 编译器将模板实参传递给模板形参,实例化函数模板,产生模 板函数;编译器将函数调用与产生的模板函数进行链接。 显式:函数名 <模板实参表 >(实参);12.2.3 函数模板的重载与特例 对于重载过程中的特殊情况 用普通函数做个别处理在基本模板定义之后,补充模板特例 template<>类型名 函数名<类型名 >(参数表)前缀 template<> 表示这是模板特例, <类型名 >表示这个特例实 在模板参数是该类型时使用的(可省略)12.3 类模板12.3.1 类模板的定义 类模板定义的语法形式: template< 模板参数表 > class 类名 ; 类模板的成员函数可在类外定义,若果该成员函数中有模板参 数则先进行模板声明,再用类模板名,而不是用类名做限定。12.3.2 类模板的使用 实例化类模板的语法格式:类名 <模板实参表 >1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国木制化学实验台市场调查研究报告
- 2025年中国有磁盘数据监测研究报告
- 2025年中国景河特曲酒市场调查研究报告
- 2025年中国无线接收端数据监测研究报告
- 2025年中国旋转感应门数据监测研究报告
- 2025年中国文化胶水市场调查研究报告
- 耳真菌病健康宣讲
- 2025至2031年中国红心结套玩具行业投资前景及策略咨询研究报告
- 新疆喀什第二中学2025届高三第三次调研考试(物理试题)试卷含解析
- 肇庆市实验中学高中历史二教案:第课新潮冲击下的社会生活
- 中国血管性认知障碍诊治指南(2024版)解读
- 街电合同范例
- 植被恢复合同模板
- 职业能力倾向测验事业单位考试(医疗卫生类E类)试题与参考答案(2024年)
- 环境监测检测服务质量评估
- 高中生物(人教2019版必修2)全册教材知识深挖(学生版+解析版)
- 创新创业实战学习通超星期末考试答案章节答案2024年
- 2024年重庆市公务员录用考试《行测》试题及答案解析
- 包装标准规范要求
- GB 21258-2024燃煤发电机组单位产品能源消耗限额
- 新进(转岗)职工三级安全教育培训表
评论
0/150
提交评论