1、c+期末总复习-精华篇c+复习摘要第一部分简单的程序设计一、标识符(包括变量名命名规则)1、定义:由数字、大小写字母和下划线组成2、例子:合法:Int(大小写不一样,不是关键字int)、_ab不合法:new和friend(不能与关键字相同)、a+b(不能有+)、2b(开头不能是数字)二、 基本数据类型存储空间位数存储形式double864补码int432补码float432补码char18ASCII码特殊:指针*p4(固定为long int类型)string16(固定大小)注1:精度低自动转换精度高注2:int a;a=8/3a=2(int整型)三、 常量与变量1、 八进制正负号和0开头,例:
2、012、-057十六进制正负号和0x或0X开头,例:0x34、-0X682、 字符常量(1) 普通字符:A、0、#、 (空格)(2) 转义字符:n、(表示)、0(3) a一个字节,“a”两个字节(包括/0),长度为1注:ddd表示八进制字符xdd表示十六进制字符例:strlen(“abc1200a s0d”)和sizeof(“abc1200a sd”)的值分析1:其中有a、b、c、120(八进制)、0(碰到第一个则终止,且不计入长度),所以结果为5分析2:算上所有的字符(包括0,注意有个空格在a与s之间),结果为11(char字符占一个字节)3、 指数:2e-6、-1.5E2(结尾加一个f(F
3、),表示结果为float型)注:e(E)后(即指数)必须是整数四、 运算符和表达式1、 算术运算符+、-、/(不是)、*(不可省略)、%(取余)注1:+()、-(),其中()中必须是变量,不能是常量和表达式例:5+、(a+b)+、+(2*i)不合法注2:int i=5,b;b=i+;b=5;i=6 int i=5,c;c=+i;c=6;i=62、 赋值运算符(1) 区分“=”和“=”(2) a+=ba=a+b3、 关系运算符和逻辑运算符(1)结果总为1或0例1:t=54t=(54)54为真,则结果为1t的值为1例2: a=1&2a=(1!=0)&(2!=0)a=1(&运算优先级高)4、 逗号运
4、算符:表达式结果为最后一个逗号后的结果例:a=3*5,a+5表达式结果为20五、 语句1、 if(a)if(a!=0)2、 do whlie语句至少执行一次例:do int i=1;j=0while(a=b)分析:先循环一次,由于条件为i=j(i=bj)!=0(不是a=b),则结果是无限循环3、 switch语句不一定每个case后都有break(跳出当前循环语句,而不是if语句),default至多一个。例:switch(a)case 1:coutA;break;case 2:coutBcase 3:coutC;break;若输入a=2,则输出的结果为BC,程序从第二个开始执行,因为没有br
5、eak跳出当前程序,会继续执行下面的程序,直到break跳出等。4、 for循环:注意是否会无限循环(循环条件的正确性)例:for(int x=0;x无限循环六、 补充1、 continue跳过剩余语句(继续循环,不会跳出)2、 const int a=5a的值不会再变(即a=6错误)3、 运算符优先级逻辑运算符(!&|)条件运算符(A?B:C) 值运算符(=、+=、*=)4、 条件运算符A?B:C例:54?3:2若A为真,则输出B,否则输出C,所以答案为3第二部分构造数据类型一、 数组1、 数组下标只能是常量(an、a不合法)2、 int a2020数组未初始化,则元素的值不确定(除了静态数
6、组未初始化时,默认是0)int a2020=0元素全部为0,且每个元素都必须是int型的注:a(5)a=5,上述数组最后一个元素为a19193、 部分初始化:a5=1,2,3a5=1,2,3,0,0二、 指针1、*取内容,&取地址int a5=0 , *p , p=&a0(或p=a)取出a中的首地址(即a0)放在p中,则p中所存内容就是a0的首地址(*p即读取p中地址的内容就是a0)(1)coutp本身的首地址(2)cout取p中所存的地址,再输出a的首地址(3)cout取p所存首地址的内容输出a0(4)cout指针往后移动一位输出a1注:*(p+)*(p+1)2、动态内存分配(1)int *
7、p=new floatN一维数组(这里N为变量)int (*p)4=new float34二维数组最后delete p三、 引用1、 int r,&rv=r别名与目标名(即rv和r)共用内存2、 类型必须一致,必须立即初始化(int &rv;错误)例:int a;double &b=a;错误3、 不能中途换名例:int a,c;int &b=a,&c=b;错误4、 数组引用:int a5=0;(&rv)5=a; 四、 字符串1、 char s20=”c+程序设计”,*p=s;(1) sizeof(s)一共可存放20个元素,每个都是char(占一个字节)结果为20(2) sizeof(p)p是指
8、针,一定为4个字节结果为4(3) Strlen(s)”c+”为三个字节,”程序设计”(汉字是两个字节)为8个字节(不含0)结果为11注:char a5=”12345”错误(必须有一个位置放0)2、String(1) string a=”man”,b=”kind”;a1=ea=”men”可以当作数组看(2) 可以连接:c=a+bc=”mankind”(3) 可以相互赋值:a=ba=”kind”注:(2)和(3)都是char字符型数组所不能实现的例:char a5=”c+”,b6=”hello”;a=b;错误五、 其他类型1、 枚举类型:enum例:enum seasoon spring,summ
9、er,autumn,winter;season s=winters=3;分析:spring相当于0,后面逐次递增(可以对spring进行默认值设定,令spring=1,后面依次递增)2、 结构体:struct类比类与对象3、 共用体:union注:若干个成员中,其中占用内存最大的,作为共用体类型的大小(不是相加)例:union aint x;char s;显然占4个字节(int),而不是char的1个字节六、 补充1、 char name20cout输出为字符数组的内容 int name20cout输出首地址2、 char *p=”hello”(类比数组)(1) couth(2)couthel
10、lo(3) coutello指针向后移动一位,指向e,再输出后面的内容3、 strcmp(s1,s2)进行大小比较 Strcpy(s1,s2)s1=s2(将s2的内容赋给s1) S=strcat(s1,s2)将s1与s2的内容进行连接,再给S第三部分函数一、 认识函数1、 声明:int add(int a,int b);形参不占用空间,可省略为int add(int,int);(注意要有”;”)调用:z=add(a,b)a,b均为实参(有内容)例:z=swap(a+b,max(c),v)swap函数实参为3个(两个逗号)2、c+的程序总是从main函数开始执行的3、函数不允许嵌套定义,但是可以
11、相互调用4、有默认值的形参右边都要有默认值例:int(int a,int b=0)合法 int(int a=0,int b)不合法5、 引用传递:swap(int &x);x的值与函数结果有关swap(int x);swap函数只是利用了x的值去运算,而未改变x本身的值二、 简单函数1、 递归函数(可简化程序,但时间和空间需求大)例:阶乘int f(int n)if(n=1)return0;else return n*f(n-1);2、 内联函数(提高程序执行效率,以空间换时间):inline例:inline int add(int a,int b)只能包含一些简单的语句3、 系统函数例:sq
12、rt(2)开方,fabs(-9)绝对值,rand()随机函数4、 函数重载功能相似(1) 同名函数,但函数的参数类型、个数或者顺序不同(2) 函数的返回值类型不能作为函数重载的区分条件(3) 不能把功能不同的函数放在一起重载三、 其他1、 int a就相当于auto int aauto为自动变量,存放于动态存储区,可省略2、 extern外部变量(属于全局变量),定义在函数体(包括mian函数)之外全局寿命3、 static静态变量(未初始化时,就默认为0)有记忆功能(记住上一次运行结果)第四部分类与对象一、 类与对象的认识1、 c+通过类来实现封装2、 面向对象程序设计的三个特征:封装性、多
13、态性和继承性3、 在类体内不能对数据成员进行初始化(因为没定义对象)例:Class Aprivate:int data=2;错误二、 类成员1、 private(私有成员)若开头省略,则默认为私有成员,只有该类的成员才能进行访问私有成员(派生类和对象都不能访问)2、 protected(保护成员)允许派生类访问,不允许对象访问3、 public(共有成员)定义了类的外部接口,允许派生类访问,并可以被对象进行调用4、 成员函数类内声明settime(int a=0,int b=0)类外定义void Clock:settime(int a=0,int b=0)三、 对象1、 对象所占据内存只用于存
14、放数据成员(如a、b等),类中函数代码在内存中只占据一份空间2、 访问类型:Clock c,*time=&c,则有c.showtime()或(*time).showtime或time-showtime()四、 构造函数与析构函数1、 构造函数对象的初始化(1) 它是一个与类同名的成员函数,没有返回值,定义为公有函数,只能在定义对象是被系统内自动调用(2) 类中可以有多个构造函数,构造函数可以被重载,可以是内联函数(3) 带默认参数的构造函数例:构造函数 Clock(int a=0,int b=0)Clock c1,c2(1),c3(1,1)均是正确的,如c2(1)等价于c2(1,0)(4) 复
15、制构造函数:Clock(Clock &c)例:Clock c1;Clock c2(c1)Clock c2=c1注1:Clock *p不会调用构造函数 Clock *p=&a出现对象a,则调用构造函数注2:Clock a4=c1,c2,c3,c4由于有4个元素都被类定义,故调用4次构造函数,程序结束时调用4次析构函数五、 析构函数:Clock()()中不能有参数1、 析构函数属于公有成员,不能重载,但可以是虚函数2、 当对象被删除或者程序结束时,自动调用析构函数例:Clock *p=new Clock a;delete p申请的空间被删除,则对象也消失,故调用一次析构函数3、 一般情况下,调用几
16、次构造函数,结束时就相反顺序调用几次析构函数六、 友元:friend1、实现不同类之间的数据共享,但破坏了类的封装性和隐蔽性2、友元函数不属于类的成员函数,可以访问类的所有成员(包括私有成员)3、友元类:如Class A.friend Class B;.意味着B类是A类的友元类B类的所有成员函数都可以访问A类的所有成员4、友元关系不能传递且是单向的(A是B的友元函数,但B不是A的友元函数),友元关系不会被继承七、其他1、 this 指针:存在于类的成员函数中,用于区分数据成员(除静态数据成员外)2、 静态成员:static(1) 不属于某个对象,属于整个类(只能通过类名进行访问)(2) 类外初
17、始化,同样具有”记忆功能”3、 const可用于对函数重载的区分4、 类别对象是否可以访问派生类是否可以访问private 否否protected 否是public 是是5、 类别可以重载或内联数量是否可以有形参构造函数是一或多是析构函数否一否注:均无返回类型(如int、double),析构函数可以是虚函数第五部分继承与派生一、 继承1、 若省略继承方式,则默认为私有继承例:Class A:BClass A:private B2、 派生类继承了基类除去构造函数和析构函数之外的全部数据成员和函数成员派生类中也有和基类一样的函数3、 同名覆盖派生类中的新的同名函数覆盖基类的函数4、 继承方式基类中
18、的成员将在派生类中有的访问权限例:Class B:protected AA中的成员在派生类中的访问权限是protected(故派生类的对象不能访问,派生类可以访问)注:A中的public和protected在B中的访问权限都变成protected注1:派生类的对象可以访问基类的public注2:即使基内的private在派生类不可访问却仍然存在注3:private属于”传递一代”,protected可以”多代传递”二、 派生1、 派生类的构造函数和析构函数(1)例:Clock(int a,char b):Point(b)注:派生类构造函数既要初始化派生类新增的成员,也要为他的基类的构造函数传递
19、数据引用了基类的构造函数(2) 派生类定义对象时,构造函数调用顺序:先基类内嵌对象最后派生类例:Class B:public Apiblic:A a;故先调用两次A的构造函数,在调用B的构造函数一次析构函数则反向执行注:若为多继承Class C:public A,protected B则顺序执行A的构造函数,再是B的构造函数,最后是C的构造函数2、 虚基类(1) 消除多继承引起的二义性,消除数据冗余(2) 通过虚基类继承,最后建立对象的类(称之为最远派生类),才调用虚基函数的构造函数保证对虚基类的对象只初始化一次三、 其他1、 若基类的构造函数有默认值,则派生类就不必给基类传递数据例:Clas
20、s AA(int x=1);Class BB(int y=1)而不必写成Class BB(int y,int x):A(x)2、 积累与派生类的赋值兼容(1) 派生类的对象可以赋值给基类对象就是派生类将基类的那部分赋值给基类反之不行(2) 同一基类的不同派生类对象不能相互赋值(只是交集,不是包含关系)总结:派生类可以对基类进行操作即(基类)=(派生类)的操作是对的,反之都是错的例:Class AClass B:public AA a;B b;a=b(对)b=a(错误)3、 判断是否可以访问类别基本身派生类派生类的对象 基的私有成员是否否基的保护成员是是否基的公有成员是是是第六部分多态性一、 编
21、译时的多态:函数重载、运算符重载运行时的多态:虚函数二、 运算符重载:operator1、 成员函数 =、()、(这些只能为成员函数)例:加法类中声明:Complex operator+(Complex &c)类外定义:Complex:Complex operator+(Complex &c)函数的实现:c3=c1+c2注:成员函数隐藏一个this指针,故参数比非成员函数少一个2、 非成员函数:friend 函数返回值类型 operator运算符(形参表)例:friend Complex operator+(Complex &c1,Complex &c2)注:”和”只改变功能(4) 重载函数不
22、能有默认参数,且必须至少有一个类的对象例1:Complex operator+(Complex &c=2)不合法例2:Complex operator+(int &c)至少一个Complex类对象(5) operator =(无形参)前缀一元运算符(6) 对于+a,重载为成员函数a.operater+() 重载为非成员函数operator+(a)对于a+,重载为成员函数a.operater+(0) 重载为非成员函数operator+(a,0)注1:可知,成员函数的形参比非成员函数少一个(this的作用)注2:某一填空题bool Bounce operator!(Bounce)三、 虚函数1、
23、例:A a,*p;B b;则基类对象的指针在指向派生类时,只会指向派生类中的基类部分(谁定义你,你就只与谁有关)虚函数可以使基类中的函数”隐藏起来”,从而使指针指向派生类的同名函数2、 只有类的成员函数才能是虚函数(构造函数不行,析构函数可以),非成员函数都不行,内联函数不行,静态函数不行3、 必须为public继承,由”基类对象的指针或引用”去掉用基函数,才能实现动态绑定四、 纯虚函数和抽象类1、 纯虚函数:virtual void hello(int x)=0;2、 一个类包含了纯虚函数,则为抽象类抽象类不能定义对象,只能为基类3、 派生类若没给出基类的纯虚函数的函数实现(即定义一个与纯虚函数同名的有实际作用的函数)仍不能定义对象,还是一个抽象类(没有同名函数覆盖纯虚函数)4、 虚析构函数使派生类的析构函数先执行,再执行基类的析构函数否则可能有内存泄漏(只执行了基类的析构函数)