1、构造函数
a)构造函数是类的一种特殊成员函数,一般情况下,构造函数是专门用来初始化成员变量的,所以最好不要在构造函数中进行与对象初始化无关的操作
b)构造函数的函数名一定与类名完全相同,而且没有返回值(不是说返回值是void或者int,而是说不允许指定返回值)
c)构造函数的返回值如果指定了任何类型都是错误,构函函数的功能是替代C语言对结构体对象初始化的大括号
d)C语言对结构体成员初始化方式是使用大括号,如果该类(结构体)有了构造函数就禁止使用大括号初始化成员数据
2、构造函数的调用
a)在定义对象时指定参数或者不指定参数,都自动调用对应的构造函数 ,手工调用构造函数出错
b)构造函数分为有参数,无参数和拷贝构造函数。定义了那种形式的构造函数,就意味着有那种定义对象方式
c)使用=符号来调用构造函数,调用单参数的构造函数而且单参数类型和=符号右边的类型相同
d)一般情况下=符号右边的类型没有适合单参数构造函数就不能使用=符号构造
e)只有一种类型不需要=符号右边构造函数。系统内部有缺省的拷贝构造函数,内部实现的是整体赋值
3、拷贝构造函数
a)拷贝构造函数是特殊的构造函数,主要是用一个已有对象整体初始化新的对象
b)标准拷贝构造函数:类名(const 类名 &对象)
c)非标准拷贝构造函数:类名(类名 &对象)
4、析构函数、
a)析构函数可以手工调用但是不推荐手工调用,主要是对象的生命期结束时,会自动调用析构函数
b)析构函数名是在类名前加“~”,析构函数同样不能返回任何值,也必须没有参数,并且不能被重载
c)一个类可以有多个构造函数,但是只能有一个析构函数
d)一般来说,每当创建一个对象时就调用对象的构造函数,每当撤销一个对象时就会调用该对象的析构函数
e)对于全局定义的对象,每当程序开始运行,在主函数main
或者Winmain
接受程序控制权之前,就调用全局对象的构造函数,在整个程序结束时调用析构函数
f)对于局部定义的对象,每当程序流程到达该对象的定义处就调用构造函数,在程序离开局部变量的作用域时调用该对象的析构函数
g)对于关键字static
定义的局部变量,当程序流程第一次到达该对象的定义处时就调用构造函数,在整个程序结束时调用析构函数
d)对于用new
运算符创建的对象,每当创建该对象时调用构造函数,当用delete
删除该对象时,调用析构函数
5、构造函数和析构函数总结
a)无论是构造函数还是析构函数,都应该把它们视作是一种析构函数
b)构造函数和析构函数本身并不对类成员数据做任何初始化或者堆空间的清理工作
c)析构函数本什么都不做,只是到了对象的空间要销毁的时间点,提示程序员是否要编写一些代码来清理曾经申请过的堆空间
d)在析构函数程序员只需要考虑对申请过的堆空间进行释放,而对象本身占用的无论是栈空间还是全局空间都会由系统自动清理
6、私有权限和公有权限
a)私有成员函数和私有成员变量,只限于在本类的成员函数中调用
b)私有成员函数和私有成员变量,被禁止在全局函数和其他类成员函数中调用
c)构造函数和析构函数如果是私有的,将无法在类的外部(包括栈、堆、全局)定义对象
7、在C++开发中成员权限的选择
a)严谨的软件工程中,每个类的成员缺省全是私有,逼不得已公开的才公开
b)开放的软件工程中,每个类的成员缺省全是共有的
c)某些类本身就是做接口类或者通用类,全部是公有的
d)如果是自己编写开发的功能类,推荐使用严禁的软件工程
8、类对象做成员变量的构造和析构顺序
a)类内的对象先构造,按照类内对象定义顺序先后构造
b)类内对象都构造完成后,(外层的)类自身才开始执行构造
c)析构顺序与构造顺序相反,是先进后出的顺序
9、类(class)说明
结构体在C语言中只能存放成员变量,在C++语言结构中还有以下新的功能:
a)struct
除了对成员变量管理外还新增了成员函数,在C语言中struct
不能使用成员函数
b)struct
新增了权限管理
c)struct
新增的友元是对成员变量开辟的一种特殊权限
d)struct
新增了静态成员变量,当然函数也有静态成员函数,struct
对静态和成员变量都支持
以上区别是针对C编译器中结构体的对比,实际上,类(class)和结构体(struct)在C++编译器中几乎只有成员缺省权限不同,struct缺省是公有权限,class缺省是私有权限
10、只读成员函数
a)未经const限制的对象或者成员函数是普通对象或者普通成员函数,只读成员函数是const置于成员函数右括号之后修饰的成员函数
b)成员函数不修改成员变量的数据,即:成员函数中出现的成员变量仅可以作为右值,不可以作为左值
c)没有只读的构造函数和析构函数,只读对象和对象之间用同一个构造函数和析构函数
d)要对成员数值进行设置(set…)的函数,不能使用const只读函数
e)返回值是引用类型的时候,返回的变量是本类的成员时,也不能使用const只读函数
f)当两个版本共存时,对象优先调用普通的成员函数,只读的成员函数仅仅用于只读对象
g)对象可以调用只读成员函数,关键字const本质上约束this指针形参为只读属性
11、只读对象
(只读对象只能调用只读成员函数)
a)只读对象是关键字const限制的对象,只读函数存在的意义,就是为了只读函数能调用本类的成员数据(读取类内数据)
b)只读对象也可以只读成员函数,非只读函数对于只读函数和普通函数都可以调用
c)对象定义时加上了const的关键字限制之后,所有的类内数据都变成了只读数据
d)在只读成员函数中的this形参被默认为是:const CTest* this类型
12、只读成员变量
a)只读成员变量只能在构造函数初始化列表中进行赋值
b)普通成员变量既可以在构造函数的初始化列表中进行赋值,也可以在构造函数或者其他的成员函数中赋值
c)每个对象内的只读成员变量的数值根据对象的不同数字有可能是不同的
13、const和static
a)const关键字解决只读问题,static关键字解决全局区问题
14、static局部变量
a)地址在全局区
b)只有第一次进入函数初始化
c)生命期在离开main函数之后结束
d)每次进入函数时不会重新初始化,保留进入函数之前的数值
15、static全局变量
a)普通全局变量可以跨文件用extern关键字来应用
b)static全局变量不可以用extern关键字来跨文件调用
c)加了static关键字修饰,不同源文件之间可以有同名的全局变量
d)static全局变量的含义是本源文件专用,或者叫做本文件私有变量
16、static成员变量
a)当类内的变量前加上static关键字,就是静态成员变量
b)静态成员变量的地址在全局区,是全局性质的变量
c)只是在名义上划归为某个类,但是该类的空间不包括静态成员变量
d)调用方法可以用对象或者this指针,也可以直接指定类名加上定义域去调用
e)静态成员变量一般定义为公有,跟对象是无关的
17、重载函数
a)在相同的声明域中的函数名相同的,但是参数列表不同的,即通过函数的参数列表作为唯一表示来区分函数的一种特殊的函数
18、递归函数
a)递归函数的功能跟循环语句的功能基本上是一样的
b)递归函数的优点:代码更加简洁,可读性更好
c)递归函数的缺点:由于递归需要系统堆栈,所以空间消耗要比非递归代码大很多。如果递归深度太大,系统有可能支撑不住。
d)对于线性结构的遍历,推荐使用循环可以节省空间消耗
e)对于非线性结构的变量,有时难于用循环取代递归函数,例如:对二叉树遍历或者对目录系统的遍历
f)递归函数跟循环一样需要结束条件,否则即使死递归。死递归比死循环更加严重,不但消耗CPU空间而且会耗尽栈空间
19、运算符重载
a)不允许重载的运算符:
只有5个:分别是:
. (成员访问符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)
b)单目运算符:
在成员函数中制作,一般有返回值不带参数
c)双目运算符:
在成员函数中制作:使用一个参数,运算符左边对象时主调对象的地址this,运算符右边传入的参数(一般用引用)
在全局函数中制作:经常跟friend连用,使用两个参数,运算符左边对象时第一个参数,运算符右边是传入的参数(一般用引用)
d)外壳类(iterator)
使对象跟指针看上去非常类似,可以取值*,可以++和–
e)串的数据结构:(CString和std:string)
f )必须放在类内进行重载的运算符:(),[],->和赋值运算符=