1、面对对象:为了能更直接地描述客观世界中存在的事物(即对象)以及他们之间的关系

2、类:对同类型的对象抽象出其共性,形成类;类中的大多数据,只能用本类的方法进行处理

3、对象:将数据以及数据对象的操作方法放在一起,作为一个相互依存不能分离的主题

4、封装:尽可能的隐藏内部细节

5、继承:特殊类的对象拥有其一般类的全部属性与服务,称为特殊类对一般类的继承

6、多态性:一般类中定义的属性或者行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为

7、面对对象的软件开发:分析 设计 编程 测试 维护

8、程序开发基本概念:源程序 目标程序 翻译程序 汇编程序

9、标识符:大小写字母和下划线开始,由大小写字母下划线和0~9的数字组成,大小写表示不同的标识符,不能是C++关键字

10、数据类型bool(false ture)1、char1 short int 2 int4 float4 double8

11、调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数

12、形参:实现主调函数与被调函数之间的联系,函数体的内部变量,寿命和可见性仅限于函数内部

13、形参名可以省略

14、隐含转换:低类型数据转换为高类型数据。转换是安全的,因为在转换的过程中数据的精确度没有损失

15、显式转换:int num;float num2=float(num);//将num转换为float型

16、break用于switch结构中;continue结束本次循环,接着开始判断决定是否继续执行下一次循环;goto会破坏程序的结构,减少使用

17、typedef int number //number是int 型的别名

18、枚举型enum 名称{变量值列表},枚举元素按常量处理,不能对其赋值,默认值为0,1,2…..

19、函数的嵌套调用:函数1调用了函数2,函数2调用了函数3。

20、函数的递归调用:函数直接间接的调用本身

21、递归包含(1)递归关系(2)终止条件n=1

22、函数的参数传递

(1)值传递

①函数调用时,给形参分配内存空间

②形参的改变不影响实参

③实参可以为常量、变量、表达式

(2)引用传递

①适用于通过形参改变实参的情况

②引用时一种特殊类型的变量,可以认为是另一个变量的别名

③声明一个引用时,必须同时对他进行初始化,使它指向一个已经存在的对象

④一旦一个引用被初始化后,就不能改为指向其他对象,也就是说一个引用自诞生起就必须确定是哪一个变量的别名,而且始终只能做该变量的别名,不能另做他用

Void swap(int &a,int&b)//引用的形式

23、内联函数:不是在调用时发生控制转移,而是在编译时将函数体嵌入在没一个调用处,节省了参数传递控制转移等开销,关键字inline声明

24、带默认形参值的函数:函数在定义时可以预先声明默认的形参值

注意

①带默认值的形参要靠右

②相同的作用域内,不允许在同一个函数的多个声明中对同一个函数的参数的默认值重复定义,即使前后定义的值相同也不行

25、函数的重载:两个以上的函数,具有相同的函数名,但是形参的个数或种类不同,编译器根据实参和形参的类型及个数最佳匹配,自动确定调用那一个函数

注意:

(1)重载函数的形参必须不同①个数 ②种类

(2)编译器不以形参名来区别函数

(3)编译器不以返回值来区别函数

(4)当使用默认形参值的函数进行重载时,需要注意防止二义性

26、C++系统函数:例如平方根函数(sqrt),绝对值函数(abs)都要加头文件#include<cmath>

第四章 类与对象

1、面对对象方法中的抽象,是指对具体问题(对象)进行概括,抽象出一类对象的公共性质并加以描述的过程

2、封装:就是将抽象的得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作的代码进行有机结合,形成类,其中的数据和函数都是类的成员。优点:对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,增强数据的安全性并简化了编程

3、继承:在保持原有类的特性的基础上,进行更具体更详细的说明

4、多态:是指一段程序能够处理多种类型对象的能力

5、类是对逻辑上相关的函数与数据的封装,他是对问题的抽象描述

6、类的定义:

(1)数据成员:数据集合的值规范

(2)函数成员:数据集合的操作规则

7、成员函数的定义:

(1)直接类内给出函数体,形成内联成员函数,不需要加inline

(2)在类中说明原型,类外给出函数实现加 ”类名::“(类外给出的成员函数如果是内联函数,要加inline)

8、类成员的访问控制

(1)共有类型public:定义类的外部接口

(2)私有类型private:只能被本类的成员函数访问,来自外部的任何访问都是违法的

(3)保护类型protected:与私有成员的性质相似,其差别在于继承过程中产生的新类影响不同

9、对象:类是一种抽象机制,描述了一类实物的共同属性和行为,for example 公司为类,雇员为改类的一个特定的实体,也就是一个对象

10、对象访问public成员:①类中直接使用成员名;②类外“对象名.成员名”

11、调用类的成员函数和调用普通函数的差异在于,要使用“.”,操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。

注意:再类的成员函数中,既可以访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员

12、内联成员函数:将函数体直接放入类体内,这种方法称为隐式声明(无需添加inline);为保证定义的简洁可以在类外声明,但是要添加inline,叫做显示声明

13构造函数:用于初始化和分配空间,创建对象时调用,通常为public成员

14、构造函数的作用:就是在函数被创建时利用特定的值构造对象,将对象初始化为一个特定的状态

注意:

①是public成员

②构造函数的函数名与类名相同

③没有返回值

④可以有形参也可以没有

⑤可为内敛函数

⑥可重载

⑦可带默认参数值

15、构造函数在对象创建的时候将被自动调用

16、如果类中没有写构造函数,编译器将会自动生成一个隐含的默认构造函数,该构造函数的参数列表和函数体都为空,如果类中声明了构造函数(无论是否有参数),编译器将不会生成隐含的构造函数

17、自动默认构造的为垃圾数据

18、clock clock::(int newH,int newM,int newS){hour =newH……..}//一般的初始化格式

19、初始化列表:clock clock::(int newH…….):hour(newH),minute(newM),second(newS){}

20、构造函数

(1)默认构造函数:无参数型

(2)有参数的构造函数

21、复制构造函数:是一种特殊的构造函数,其形参是本类的对象的引用。其作用是使一个已经存在的对象(有复制构造函数的参数指定),去初始化一个新对象。即用同类对象来初始化新对象

22、隐含的复制构造函数的功能:把初始值对象的每个数据成员的值都复制新建立的对象中

23、格式 类名 (类名 &对象名){}

24、调用复制构造函数的情况

(1)当用一个类的对象去初始化另一个类的对象时

(2)如果函数的形参是类的对象,调用函数时,进行形参和实参的结合时,形参的数据是由实参同过复制构造函数的到

(3)如果函数的返回值是类的对象,函数执行完成返回调用者时。return中的对象初始化一个临时无名对象保存返回值,传递主调函数,此时会调用复制构造函数

25、析构函数:

(1)它用来完成对象被删除前的一些清理工作

(2)析构函数是在对象的生存期即将结束的时刻被自动调用的,调用之后对象消失,内存释放

(3)类名前加“~”构成

(4)和构造函数不同的是析构函数不接受任何参数

(5)未定义,会自动生成默认析构函数函数体为空

(6)顺序与构造的顺序相反

26、类的组合:描述的是一个类内嵌其他类的对象作为数据成员的情况,他们之间的关系是一种包含与被包含的关系

27、当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。因为部件对象是复杂对象的一部分,因此在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化(使用初始化列表)

28、构造函数的调用顺序:

①调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序。注意内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序无关

②执行本类构造函数的函数体

29、必须在构造函数的初始化列表中进行数据成员初始化的

①没有默认构造函数的内嵌对象

②引用类型的数据成员

30、前向引用声明:class B

注意:提供完整类的声明前,不能声明该类,也不能在内联成员函数中使用该类的对象

31、结构体:结构体和类的唯一区别在于,结构体和类具有不同的默认访问控制属性:在类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型;在结构体中,对于未指定访问控制属性的成员,其访问控制属性为公有类型

32、结构体的初始化条件:

(1)一个结构体的全部数据成员都是公有成员py

(2)没有用户定义的构造函数,没有基类和虚函数

33、联合体的全部数据成员共享同一组内存单元,也就是说,任何两成员不会同时使用(不同时有意义),不会同时有效;联合体变量中的成员同时至多只有一个有意义

第五章数据的共享和保护

1、作用域:标识符的有效范围

2、可见性:标识符是否可以被引用

3、作用域:是一个标识符在程序正文中有效的区域

(1)函数原型作用域:在函数原型声明时形式参数的作用范围。函数声明时的形参,其作用域在左右括号之间。

(2)局部作用域:函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束之处为止。函数体内声明的变量,其作用域从声明初开始,一直到声明所在的块的大括号为止。具有局部作用的变量也称为局部变量

(3)类作用域:类可以被看作一组有名成员(函数和变量)的集合,类X的成员m具有类的作用域,对m的访问方式如下

①如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m

②通过表达式x.m或者X::m。这正是程序中访问对象成员最基本的方法

③通过ptr->m这样的表达式,其中ptr为指向x类的一个对象指针

4、命名空间作用域(不同模块中的类和函数之间有可能发生重命名,引发错误),一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的,不属于前面所述各个作用域的标识符,都属于该命名空间作用域。例如:using namespace std;具有命名空间作用域的变量也称为全局变量

5、可见性:程序运行到某一点,能够引用到的标识符,就是该处可见的标识符

规则:

①标识符要声明在前,引用在后

②在同一作用域中,不能声明同名的标识符

③在没有互相包含关系的不同作用域声明的同名标识符,互不影响

④如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见

6、对象的生存期:对象从诞生到结束的这段的时间

7、静态生存期:如果对象的生存期与程序的运行期相同,在命名空间作用域中声明的对象都是具有静态生存期。在函数内部的局部作用域中声明具有静态生存期的对象,要使用static

8、局部作用域中静态变量的特点就是,值初始化一次,若不赋初值自动默认为0,且只在函数体内起作用。文件作用域中声明的对象有这种生存期

9、动态生存期:局部生存期对象诞生与声明点,结束于声明所在的块执行完毕之时

10、类的静态成员:

11、静态数据成员

(1)采用static关键字来声明

(2)类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,他的属性值是相同的

(3)静态数据成员具有静态生存期

(4)静态数据成员不属于任何一个对象,可以通过类名对其进

12、静态函数成员

(1)不需要对象即可调用

(2)主要用来处理静态数据成员

(3)静态成员函数没有this指针

(4)使用static关键字声明的函数成员

(5)静态成员函数可以直接访问该类的静态数据和函数,而访问非静态成员,必须通过对象(即通过对象名进行访问)

(6)静态成员属于类,非静态成员属于对象

13、类的友元:友元关系提供了不同类或对象的成员的成员函数之间,类的成员函数与一般函数之间进行数据共享的机制,即友元关系就是一个类主动声明那些其他类或函数是它的朋友,进而给他们提供对本类的访问特许。通过声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息

14、友元函数:非成员函数

(1)关键字friend修饰的非成员函数

(2)在它的函数体中可以通过对象名访问类的私有和保护乘员

(3)访问对象成员必须通过对象名

15、友元类:若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。A可以访问B,通过A对象可以改变B中对象的值

注意:

①友元关系不能传递

②友元关系是单向的

③友元关系不能被继承

16、共享数据的保护

(1)常对象:常对象必须进行初始化,而且不能被更新

① 常对象不许改变,只可调用常成员函数

②非常对象可以调用常函数和非常函数

③注意不能对常量赋值

④常对象用const修饰

(2)常成员函数

①const是函数类型的一个组成部分

②常对象只能调用它的常函数,不能调用其他的函数(语法对常对象的保护,也是常对象的唯一对外接口的方式)

③任何对象在调用常函数的时候都将被默认为是常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有const修饰的成员函数

④const可以用于函数的重载

{17.函数的重载:形参的类型和个数,以及有无const}

(3)常数据成员

①构造函数只能通过初始化列表对其进行初始化,不能在函数体中进行初始化A::A(int i):a(i){}

(4)常引用

①如果引用时用const修饰,被声明的引用就是常引用

②常引用的对象不能被更新

③如果使用常饮用作为形参,便不会意外地对实参进行更改

18、外部变量:如果一个变量除了在定义他的源文件中可以使用外,还能被其他文件使用,那么就称这个变量是外部变量,需要加extern声明

19、外部函数:在所有类之外声明的函数(也就是非成员函数)都具有命名空间作用域

20、编译预处理

(1)#include指令

(2)#undef的作用是删除由#define定义的宏,使之不再起作用

第六章 数组、指针和字符串

1、数组是具有一定顺序关系的若干对象的集合体,组成数组的元素的对象称为该数组的元素

2、每个元素右n各下标的数组成为n维数组

3、数组不可以动态定义

4、每一维数组下表都是0开始

5、注意:数组的下标可以是任意合法的算数表达式但其结果必须是整数

6、数组的下表不可以超过声明时所确定的上界

7.数组的存储:顺序存储的

8、数组名常量等于首元素的地址;二维数组中a[0]是行开始的地址

9、若数组局部初始化则未初始化的为0;若数组全部未初始化则未初始化的为垃圾数据;全部未初始化的数组加static,全部初始化为0

10、使用数组名进行参数传递的是地址

11、对象数组:类名 数组名[常量表达式]

12、对象数组访问共有成员时 :数组名[常量表达式].成员名

13、对象数组初始化的过程中就会调用对象的构造函数

14、数组中的元素对象被删除时,会调用析构函数

15、指针(long int型)

16、指针是用于存放内存单元地址的

17、声明时*p代表p为指针,其他则表示取p指针所指的内容;&出现在变量声明语句中位于被声明的变量的左边时,表示引用,出现在等号右边表示取地址。

18、数组名其实是一个不能被赋值的指针,即指针常量

19、常量指针:即指向常量的指针,不能通过指针更改对象的值,但是指针本身可以改变 const int *p=&a

20、指针常量:即指针的类型是常量,指针本身不能改变,但是可以通过指针更改所指的内容 int *const p=&a

21、0或者NULL专用于表示空指针,也就是一个不指向任何有效地址的指针

22、*(p+1)取p指针的下一个数据单元的内容,*p+1指p所指的内容再加1的操作

23、*(Pa+1)<=>*(a+1)<=>a[1] a为数组名,pa为指向数组首元素的指针

24、指针数组:一个数组的没一个元素都是指针变量

25、声明了一个int型的指针数组,其元素是指向int型数据的指针,指针数组的元素必须先赋值后引用

26、指针作为函数的参数:为地址传递,形参的值会改变实参的数据,在形参之前加上const就不在改变实参

27、指针性函数:函数的返回是地址

28、指向函数的指针:即指向函数的代码区域,每一个函数的函数名就是函数的代码在内存中的起始地址,一旦函数指针指向某个函数,他与函数名就有相同的作用 例如:void (*AAA)(int) AAA:函数指针,当函数使用就相当于函数名 int:形参的类型 void表示没有返回值

29、对象指针:对象指针名->成员,对象指针没有数据

30、this指针:是一个隐藏于每一个类的非静态成员函数中的特殊指针(包括构造函数和析构函数)它用于指向正在被对象成员操作的对象

31、动态内存分配:int *p;p=new int(2)//开辟一个int型数据空间,并将初始值2存入该空间,然后姜首地址赋给指针p;若int*p=new int();//则初始化的值为0,如果没有括号则不初始化

32、new Y和new Y()都会调用用户自定义的默认构造函数

33、注意new 必须和delete 一起使用,例如int *p=new int(2);delete p;否则会产生内存泄漏,delete释放的是内存空间而不是指针本身,指针依然存在

34、 int (*p[2][3])=new int[1][2][3]//多位数组开辟空间

35、vector不是类而是一个类的模板

36、浅复制:使用默认的复制构造函数创建新的副本时,原对象和副本指向的同一个地址,没有形成真正的副本,即两对象使用同一块存储空间,对原对象做出改变的同时所产生的副本也会变化,而且在析构函数调用时会连续析构两次同一空间,产生报错

37、深复制:不仅复制函数的数据而且复制开辟新的存储空间

38、字符串结束的标志要在结尾加上‘\0’

第七章 继承与派生

1、类的继承:是新的类从已有类那里得到已有的特性,从已有的类产生新的类的过程就是类的派生,原有类称为基类或者父类,产生的新类称为派生类或者子类

2、继承的格式:

Class 派生类名:继承方式 基类名1,。。。。。继承方式 基类名n{} 如果没有说明继承方式默认为private,每一个继承方式仅对其后一个基类起作用

3、多继承:每一个派生类可以有多个基类

4、单继承:派生类只有一个基类

5、直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层基类称为间接基类,继承方式规定了如何访问从基类继承的成员

6、派生类成员:是指除了从基类继承来的所有成员之外,新增加的数据成员和函数成员

7、派生类的生成过程

(1)吸收基类成员:派生类实际上就包含了它的全部基类中除了构造函数和析构函数之外的所有成员

(2)改造基类成员:

①基类成员的访问控制问题:主要依靠派生类定义时的继承方式控制

②对积累数据或者函数成员的隐藏或覆盖:隐藏是指如果一个派生类声明了一个和某基类成员同名的新成员(如果是成员函数,则参数表也要相同,参数不同的情况下属于重载),派生类的新成员就隐藏了外层同名函数,这时在派生类中或者通过派生类的对象,直接使用成员名就能访问到派生中的同名成员,称作同名隐藏

(3)添加新的成员:派生类新成员的加入是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。在派生的过程中,基类的构造函数和析构函数是不能被继承的,因此要实现一些特别的初始化过程和扫尾工作,就需要在派生类中增加新的构造函数和析构函数

8、访问控制

(1)公有继承:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问控制属性在派生类中不变,而基类的私有成员不可直接访问

(2)私有继承:当类的继承方式为私有继承时,基类中的公有成员和保护成员的访问控制属性都以私有成员的身份出现在派生类中,而基类的私有成员不可直接访问

(3)保护继承:保护继承中,基类的公有成员和保护成员都以保护乘员的身份出现在派生类中,而基类的私有成员不可以直接访问

注意:保护成员和私有成员的性质几乎一致,只是在继承对新类产生的影响不同

9、私有继承和保护继承的比较:私有成员既不能被被派生类访问也不能被外部使用者访问,而保护继承有可能被派生类访问,但绝不可能被外部访问者访问

10、类型兼容性规则:指在需要基类的任何地方,都可以使用公有派生类的对象进行替代,在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员(公有继承能从基类中得到除构造函数和析构函数之外的所有函数)

11、派生类的构造函数:构造派生类的对象时,就要对基类的成员函数和新增成员对象进行初始化,基类的成员函数不被继承,派生类中需要声明自己的构造函数。

12、派生类的构造函数的执行顺序

(1)调用基类构造函数,调用顺序按照他们被继承时声明的先后顺序(从左到右)

(2)对派生类新增的成员对象初始化,调用顺序按照他们在类中的声明顺序

(3)执行派生类的构造函数体中的内容

13、派生类的析构函数:和构造函数调用顺序相反

14、虚基类:将共同的基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中就只有一个副本,同名函数名也只有一个映射。声明过程中使用virtual关键字。优点:只维护一份成员副本,更加节省内存空间。注意关键字virtual的位置

15、最远派生类:建立对象时所指定的类称为当时的最远派生类

16、特点:只有最远派生类的构造函数会调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用都将被忽略

17、构造一个类的对象的一般顺序

(1)如果有直接或者间接的虚基类,首先执行虚基类的构造函数

(2)如果有其他基类,则按照他们在继承声明列表中出现的次序,分别执行他们的构造函数,但不在执行他们虚基类的构造函数

(3)按照在类中出现的顺序,对派生类中新增的成员进行初始化。

第八章多态性

1、多态性的概述

多态是指同样的消息被不同的对象接受时导致不同的行为。所谓消息是指类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。

2、多态性的类型

面对对象的多态性可以分为4类:

专用多态:

(1)重载多态:普通函数及类的成员函数的重载都属于重载堕胎

(2)强制多态:是指将一个变元的类型加以变化,以符合一个函数或者或者操作的要求,例如加法运算符在进行浮点数和整数相加时,首先进行类型的强制转换,把整形浮点数变为浮点数再相加

通用多态:

(1)包含多态:时类族中定义于不同类中的同名函数成员的多态性为,主要是通过虚函数来实现

(2)参数多态:与类模板相关联,在使用时必须赋予实际的类型才可以实例化

3、多态的实现

分类:

(1)编译时的多态:在编译的过程中确定了同名操作的具体操作对象

(2)运行时的多态:在程序运行的过程中才动态地确定操作所针对的具体对象

4、绑定:是指计算机程序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程,就是把一条消息和一个对象的方法相结合的过程

5、绑定的分类:

(1)静态绑定:编译衔接阶段完成的情况

(2)动态绑定:绑定工作是在程序运行阶段完成的情况成为动态绑定

6、运算符的重载

运算符的重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同数据类型时导致不同的行为

7、运算符的重载规则

(1)C++中的运算符除了少数几个之外,全部可以重载,而且C++中已经有的运算符

(2)重载之后的运算符的优先级和结合性都不变

(3)运算符重载是根据新类型数据的实际需要,对原有运算符进行适当的改造,重载功能应该与原有功能相似,不能改变操作对象的个数,同时至少有一个操作对象是自定义类型。

8、C++规定:不能重载的操作符:类的关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”、和三目运算符“?:”

运算符的重载形式:

(1)重载位类的非静态成员函数

(2)重载位非成员函数

9、运算符重载的语法形式

返回值类型 operator 运算符(形参表)

{

函数体

}

10、一些定义:

(1)返回值类型:运算结果的类型

(2)operator是指定义运算符重载函数德关键字

(3)运算符即使要重载德运算符名称,必须是C++中可以重载德运算符,例如重载加法运算,这里就重写“+”

(4)形参中给出重载运算符所需要德参数和类型

11、运算符重载位成员函数:

(1)运算符重载实际上就是函数重载,实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,左操作数是对象数据本身,右操作数则需要通过运算符重载函数的参数表来传递;如果是单目运算符,操作数由对象的this指针指出,就不再需要任何参数

(2)双目运算符:为实现oprd1 B oprd2,其中oprd1为A类的对象,则应该把B重载为A类的成员函数,该函数中有一个形参,形参的类型是oprd2所属的类型。

(3)单目运算符:如“-”(负号),应重载为成员函数,且无形参。

(4)单目后置运算符“++”、“--”重载为类的成员函数,实现oprd++,其中oprd为A类的对象,那么运算符就应当重载为A类的成员函数,这时函数要带有一个整形(int)形参,其不起任何作用只是用来区分后置++、--和前置++、--

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐