1、自考 c+知识点总结整理 第一章第一章 1.动态分配内存动态分配内存 使用 new 关键字: 1) 为一个对象分配内存: 指针名 = new 类型名; 2) 为一个对象数组分配内存:指针名 = new 类型名长度; 使用 delete 关键字:1)释放对象占用内存:delete 指针名;2)释放 一个对象数组占用内存:delete 指针名。 注意:new 和 delete 必须成对出现,且 delete 释放一个对象时,会调 用析构函数。 2.引用引用 数据类型 int 则 b 是对 a 的引用 3.什么是左值和右值?什么是左值和右值? 左值:必须是能被计算和修改的。 右值:右值表达式的值必须
2、是固定的。 4.指向常量的指针指向常量的指针 指向常量的指针一般形式:const int *p 注意:*p 不能作为左值。 5.常量指针常量指针 常量指针一般形式: int * const p 注意:*p 不能作为左值。 6.指向常量的常量指针指向常量的常量指针 常量指针一般形式:const int * const p 注意:*p 不能作为左值。 7.泛型算法应用于普通数组泛型算法应用于普通数组 对数组进行升幂排序,反转数组内容,复制数组等要包含 头文件包 对数组进行降幂排序和检索要包含头文件包 (1)反转数组内容:reverse(a , a+数组长度) (2)复制数组内容 : copy(a,
3、a + 数组长度,b) (3)reverse_copy(a ,a +数组长度 ,b);reverse_copy 是将数组的内容从 尾到头的逆向复制 (4)数组升幂排序:sort(a , a+数组长度) (5)数组降幂排序 : sort(b , b+ 数组长度 , greater() (6)查找数组内容 : find(a , a+数组长度 ,value) (7)数组内容的输出:copy(a , a+ len ,ostream_iterator(cout, 字符串); 注意:可将 ostream_iyerator 理解为输出流控制符,表示数组 元素的数据类型字符串是数组元素间的间隔。 8.数据的简
4、单输入输出数据的简单输入输出 C+提高了两种格式控制方式:一种是使用 ios_base 类提供的接口; 另一种是称为操控符的特殊函数, 它的特点是可以直接包含在输出和 输入表达式中,因此更加方便。 不带参数操控符定义在头文件中,带形式的定义在头文件 中 三是无参数的操控符函数不能带有() 名称含义作用 Dec设置转换基数为十进 制 输入/输出 oct设置转换基数为八进 制 输入/输出 Hex设置转换基数转换为 十六进制 输入/输出 Endl输出一个换行符输出 Resetiosflags ( long flags) 清除 flag 标志位输出 Setiosflags (long flags) 清
5、除 flag 标志位输出 Setfill(char ch)设置 ch 为填充字符输出 Setprecision(int n)设置浮点数输出精度输出 Setw(int width)设置输出字符间字段 宽度 输出 常量及其含义 常量名含义 Ios_base : :left输出域左对齐 Ios_base : :right输出域右对齐 Ios_base : :showpoint浮点数输出必须带一个小数点 Ios_base : :showpos在正数前面加+ Ios_base : :scientific使用科学计数法表示浮点数 Ios_base : :fixed使用定点形式表示浮点数 第二章第二章 1.
6、string 对象对象 (1)string 对象包含于#include头文件包中 (2)计算字符串长度的函数:size(),使用方法是 字符串.size() (3)返回字符串子串的函数:substr(起始位置,结束位置) 注意:给出的起始位置必须位于字符串中,否则出错。如果结束位置 大于字符串的长度,则自动截取到字符串尾部。 (4)字符串查找函数:find(要查找字符串,开始查找的位置) (5)String 类有一对用来指示其元素位置在的基本函数成员:begin() 和 end(), Begin()指示第一个元素,end()指示最后一个元素之后。如果 begin() 不等于 end(),则算法
7、首先作用于 begin()所指元素,然后指向下一个 元素,知道 begin()等于 end()。所以元素存在于半开区间begin,end) 中。 (6)char 定义的字符串使用“0”作为结束标记。String 不是。 2.使用使用 complex 对象对象 (1)这个对象包含于头文件#include中 。 使用方法:complex 对象名(实部值,虚部值) Complex 使用成员函数 real()和 imag()函数输出实部和虚部值 (2)string 类型的数组的 swap()成员函数可以交换连个数组分量。 第三章第三章 1.函数的参数及其传递方式函数的参数及其传递方式 (1)对象作为函
8、数参数:将对象名作为函数参数,这种传递是单向 的,不会改变实参的值。 (2)对象指针作为函数参数:将对象地址作为函数参数,这种传递 会改变实参的值。 (3)引用作为函数参数:定义时,形参是别名;调用时,实参是对 象名。实参对象和形参对象代表同一个对象,所以改变形参对象就是 改变实参对象。 2.使用使用 const 保护数据:保护数据:使用 const 修饰符传递参数,只能使用参数 而无权修改参数。这样能提高系统安全。 3.函数返回值函数返回值 (1)函数可以返回一个引用,返回一个引用的主要目的是为了将该 函数用在赋值运算符的左边。 函数原型表示方法: 数据类型 A.Set(25,25); B
9、= A 数组对象:Point A3 使用指针和取址运算符:point *P = (2)对象可以作为函数参数,如果参数传递采用传对象值的方式, 在被调用函数中对形参所作的改变不影响调用函数中作为实参的对 象。如果传得是对象的引用(地址)当参数对象被修改时,相应的实 参对象也会被修改。C+建议使用引用,在前面加上 const 这样可以 避免修改原来的数据成员。 (3)对象作为函数参数时,可以使用对象,对象引用,和对象指针。 形式为: Void print(Point a)a.Display;/对象作为参数 Void print(Point /对象引用作为参数 Void print(Point *p
10、)p-Display;/对象指针作为参数 (4)一个对象可以作为另一个类得成员。 8.类的性质类的性质 (1)类本身的成员函数可以使用类所以的成员 (2) 类得对象只能访问公有成员函数, 例如输出 x 只能使用 A.Getx(), 不能使用 A.x (3)其他函数不能使用类的私有成员,也不能使用类得公有成员函 数,他们只能通过类的对象使用类得公有成员函数。 (4)虽然一个类可以包含另一个类的对象,但是这个类也只能通过 它被包含的这个类得对象使用那个类的成员函数, 通过成员函数使用 数据成员,例如:Loc.Set(x,y) (5)不完全类得声明:只要当使用类产生对象时,才进行内存分配, 这种对象
11、的建立过程称为实例化。 (6)有时候将类作为一个整体使用而不存取取成员。 (7)不完全类的定义没有类体。不完全类声明的类不能实例化 (8)类也可以是空的,不包含任何内容。 (9) 类中的一个成员名可以使用类名和作用域运算符来显示的指定, 这称为成员名限定。例如:void MyClass:set(int i) MyClass:number = i/显示的指定访问 MyClass 类中的标示符 number 9.对象,类和消息对象,类和消息 (1)接收对象名,调用操作名和必要的参数是对象传达消息的一般 组成部分。 第五章第五章 1.对象成员的初始化对象成员的初始化 (1)可以在一个类中说明具有某个
12、类的类型的数据成员,在 A 类中 说明对象成员的一般形式如下: Class A 类名 1 成员名 1; 类名 2 成员名 2; 。 。 。 类名 n 成员名 n ; A 类得构造函数的形式如下: A: :A(参数表 0) :成员 1(参数表 1) ,成员 2(参数列表 2) ,成员 3(成员列表 3) 其他操作。 。 。 (2) 静态成员: 简单成员函数是指声明中不含 const , volatile , static 关键字的函数,如果类得数据成员或成员函数使用关键字 static 进行 修饰,这样的成员称为静态成员或静态成员函数,统称为静态成员。 (3)静态数据成员只能说明一次如果在类中仅
13、对静态数据成员进行 声明,则必须在文件作用域的某个地方进行定义。在进行初始化时, 必须进行成员名限定。 例如:int Test : x = 25 也可以直接在构造函数中使用类成员限定符对其进行初始化。 例如:Test(int a,int b)Test:x = a; n = b (4)除静态数据成员的初始化之外,静态成员遵循类得其他成员所 遵循的访问限制,虽然还没有建立对象,但是静态成员已经存在。 (5)Static 不是函数类型中的一部分,所以在类声明之外定义静态成 员函数时,不使用 static。在类中定义的静态成员函数时内联的。 (6)类的任何成员函数都可以访问静态成员。因为静态成员函数没
14、 有 this 指针, 所以静态成员函数只能通过对象名 (或指向对象的指针) 访问该对象的非静态成员。 2.友元函数友元函数 (1)友元函数可以存取私有成员,公有成员和保护成员。其实友元 函数可以是一个类或函数,尚未定义的类也可以作为友元。 (2)友元函数在类中声明,但是他并不属于类得成员函数,所以可 以在类得外面想普通函数一样定义这个函数。 (3)将成员函数作为友元:一个类得成员函数(包括构造函数和析 构函数)可以通过使用 friend 说明为另一个类非友元。 (4)将一个类说明为另一个类的友元:可以讲一个类说明为另一个 类得友元,这时整个类得成员函数均具有友元函数的性能。声明形式 为:fr
15、iend class 类名; 3.Const 对象对象 (1)可以造类中使用 const 关键字定义数据成员和成员函数或修饰 一个对象。一个 const 对象只能访问 const 成员函数。 (2)常量成员:常量成员包括常量数据成员,静态常数据成员和常 引用。静态常数据成员仍保留静态成员函数,需要在类外初始化。常 数据成员和常引用只能通过初始化列表来获得初值。 (3)常引用作为函数参数:使用引用作为函数参数,传得是地址。 有时希望将参数的值传递给函数使用,并不允许函数改变对象的值, 这是可以使用常引用作为参数。 例如:void Display(const double /定义 type 的向量
16、表 Vectorname(length);/定义具有 length 哥 type 的向量,元素初 始化为 0 Vectorname(length a);/定义具有 length 个 type 的向量元素初 始化为 a Vectorname1(name);/使用已定义的向量 name 定义 name1 (3)不能使用列表初始化向量,但可以先初始化一个数组,然后把 数 组 的 内 容 复 制 给 向 量 。 例 如 : int IA10 = 1 , 98,1,20,152,20,48,10,14,30; VectorVB(IA,IA+10) IA 是数组名,代表数组的起始地址。IA+10 是 VB
17、 的结束标志位,因 为向量自动产生 一个结束标志。 (4)泛型指针:向量具有指示第一个元素的标记 begin 和指示结束 的标记 end 所指元素。当元素部位空是,算法首先会作用于 begin 所 指元素,并将 begin 前进一个位置。 (5)在向量中,泛型指针是在底层指针的行为之上提供一层抽象化 机制,取代程序原来的“指针直接操作方式” 。假设用 T 表示向量的 参数化数据类型, iterator 在 STL 里面是一种通用的指针, 它在向量中 的作用相当于 T*.用 iterator 什么向量的一般形式: Vector:reverse_iterator 指针名; 逆向向量泛型指针使用 r
18、everseiterator,声明方法如下: Vector: :reverse_iterator 指针名 (6) 使用 typedef 可以使声明或定义泛型的手续简单易懂, 例如下面 泛型指针 P:iterator p; (7)向量的数据类型向量除了可以使用基本数据类型之外,还可以 使用构造类型,只要符合构成法则即可。 3.向量最基本的操作方法向量最基本的操作方法 (1)访问向量容量的方法: Size() :向量中当前已经存放的对象个数。 Max_Size() :返回向量中可以容纳最多对象的个数,一般式寻址空 间所容纳的对象的个数。 Capacity() :返回无需再次分配内存就能容纳的对象个
19、数。他的初始 值就是程序员最开始申请的元素个数。 它在原来的基础上自动翻倍扩 充空间。 Max_size = capacity() = size() (2)访问向量中对象的方法 Front():返回向量中第一个对象 Back() :返回想了中的最后一个对象 Operator(size_type,n) :返回向量中第 n+1 个对象 (3)在向量中插入对象的方法 Push_back(const T&) :向向量尾部插入一个对象 Insert(iterator it,const T&) :想 it 所指的向量位置前插入一个对 象 Insert(iterator it,size_typen,cons
20、t T&X) :想 it 所指向量位置前 插入 n 哥值为 X 的对象。 (4)在向量中删除对象的方法 Pop_back(const T&) :删除向量中最后一个对象。 Erase(iterator it) :删除 it 所指向的容器对象。 Clear()了删除向量中所有的对象,empty()返回 true 值。 第八章第八章 一:一: 动态联编中的复制兼容性及名字支配规律动态联编中的复制兼容性及名字支配规律 (1)对象的内存地址空间中只包含数据成员,并不存储有关成员函 数的信息。这些成员函数的地址翻译过程与其对象的内存地址无关。 (2)声明的基类指针只能指向基类,派生类只能指向派生类他们的
21、原始类型决定他们只能调用各自的同名函数。 除非派生类没有基类的 同名函数。 二:动态联编的多态性二:动态联编的多态性 (1)使用关键字 virtual 声明的函数,将这种函数称为虚函数。当编 译系统含有虚函数时,将为他建立一个虚函数表,表中的每一个元素 都指向一个虚函数表的指针。此外,编译系统也为类增加一个数据成 员,这个数据成员是一个指向该虚函数表的指针,通常称为 vptr。 (2)派生类嫩继承基类的虚函数表,而且只要是和基类同名(参数 也相同)的成员函数,无论是否使用 virtual 声明,他们搜自动成为虚 函数。如果继承类没有改写继承基类的虚函数,则函数指针调用基类 的虚函数。如果派生类
22、改写了基类的虚函数,编译系统将重新为派生 类的虚函数建立地址,函数指针会调用该写过的虚函数。 (3)一旦基类定义了虚函数,该基类的派生类中的同名函数也自动 称为虚函数。 三:虚函数实现多态的条件三:虚函数实现多态的条件 (1)官架子 virtual 指示 c+编译器对调用虚函数进行动态连编。这 种多态性是程序运行到需要的语句出才动态确定的, 所以称为运行时 的多态性。不过使用虚函数并不一定产生多态性,也不一定使用动态 联编。 (2)产生多态性有如下 3 哥前提: 1.类之间的继承关系满足赋值兼容性规则。 2.改写同名虚函数。 3.根据赋值兼容性规则使用指针。 (3)在构造函数和析构函数中调用虚
23、函数采用静态连编,即他们所 调用的虚函数是自己的类或基类中定义的函数, 但不是任何在派生类 中定义的虚函数。 (4)如果基类的析构函数为虚函数,则在派生类中未定义析构函数 时,编译器所生成的析构函数也为虚函数。 四:纯虚函数与抽象类四:纯虚函数与抽象类 (1)纯虚函数的一般形式如下: Class类名 Virtual 函数类型 函数名(参数类表) = 0; (2)一个类可以说明多个纯虚函数,包含有虚函数的类称为抽象类。 一个抽象类只能作为基类来派生类新类,不能说明抽象类的对象。 (3)从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该 派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。
24、这说 明了纯虚函数的派生类仍是抽象类。 如果派生类中给出了基类所有纯 虚函数的实现,则该派生类不再是抽象类。 (4)抽象类至少包含一个虚函数,而且至少有一个虚函数是纯虚函 数,以便将他与空的虚函数区分开来,下面是两种不同的方法: Virtual void area() = 0; Virtual void area(); (6)在草原函数内可以钓鱼纯虚函数。因为没有为纯虚函数定义代 码, 所以在构造函数和析构函数内调用一个纯虚函数将导致程序运行 错误。 五五.多重继承和虚函数多重继承和虚函数 (1)多重继承可以视为多个单一继承的组合,因此,分析多重继承 情况下的虚函数调用与分析单一继承有相似之处
25、。 (2)在派生类中,当一个指向基类成员函数的指针指向一个虚函数, 并且通过指向度意向的基类指针(或引用)访问这个虚函数时,仍发 生多态性。 第九章第九章 一:重载对象的赋值运算符一:重载对象的赋值运算符 (1)编译器在默认情况下为每个类生成一个默认的赋值操作,用于 同类的两个对象之间相互赋值。默认的含义是逐个赋值,即将一个对 象的成员赋值, 即将一个对象的成员函数赋值给另一个对象的相应的 成员,这种赋值方式对于有些类可能是不正确的。 (2) c+的关键字 operator 和运算符一起使用就表示一个运算符函数。 (3)运算符重载的实质:运算符的重载的实质就是函数重载,要重载 某个运算符只要重载某个相应的函数即可。 (4)插入符()的一般形式如下: ostream &operator(istream &input,类名 & 对象名) 。 。 。 。 。 。/函数代码 Return input;/input 是类 istream 对象的引用,它是 cin 的别名,即 istream&input = cin。调用参数时引用 cin(即 cin 的函数) (6)另外提取符函数需要返回新的对象值,所以应该使用引用,即 “类名&对象名” , 不能使用 “类名 对象名” ,插入符不改变对象的值。