文章目录
10 对象初始化
C语言可以在函数的任意位置定义变量(不一定放在函数的最前面),但要求在第一次使用之前。
空间在进入函数大括号时分配,而构造器在运行到定义行时才被调用。
default constructor:自己写的没有参数的构造函数。
11 new&delete
new:分配空间得到地址+调用构造函数
delete:调用析构函数+通过地址释放空间
new创建数组则要使用delete[](否则释放了所有空间,但只调用了一次析构函数)。
12 访问限制
- public:公开的,任何函数都可以访问。
- private:私有的,只有类的成员函数可以访问。
同一个类的实例化对象之间可以互相访问私有成员。
如下:set()、f()和g()是类的成员函数,而main()不是。
friend:在X类中声明Y是X的朋友,则Y可以访问X的私有成员。
- protect:只有类自己和其子类可以访问。
struct和class在C++中的区别:
不限制访问属性时,struct默认是public,而class默认是private。
13 初始化列表
14 对象组合
软件重用的一种方式。
Composition:声明类时,其成员变量可以是另外一个类对象。
包含的方式:
- Fully:整个置于类内。
- By reference:通过地址访问。
15 继承
软件重用的一种方式。
Inheritance:用一个已有类来定义一个新类的手段。
如下:已有Person类,Student类继承了Person类。所以Person是Student的父类,Student是Person的子类(超集)。
举例:
16 父类子类的关系
当构造子类对象时,会调用父类的构造函数。
若父类的构造函数有参数,子类需写自身的构造函数,并通过initialize list传入参数。
构造时先调用父类构造函数,再调用子类构造函数。
析构时先调用子类析构函数,再调用父类析构函数。
当子类和父类函数同名时,它俩没有关系。
17 函数重载和默认参数(缺省参数值)
返回类型不能作为重载的条件。
若不能找到参数类型完全匹配的重载函数,则报错。
/
Default argument:在声明函数时预先给一个值作为默认值(缺省参数值)。
声明时,只能在.h中声明默认值,而.cpp仍与原函数相同。
在调用函数时,可以从最右边开始省略。
如下:
18 内联函数
当调用一个函数时,共分为四步:
- 将参数压入堆栈中
- 将返回地址压入堆栈中
- 准备返回值,放在ax寄存器中
- 将1,2步中压入栈元素弹出
Inline Funtions:当调用一个函数时,不执行以上步骤,而是将函数内容直接嵌入调用位置。
声明时,在.h和.cpp中都必须写明是inline函数。
空间换时间策略。
内联可以让编译器做类型检查等工作,比用宏更安全一些。
声明时就给出成员函数的函数体,则默认其为内联函数。简单函数可直接写为内联函数,如下:
什么时候建议内联:
- 简单函数,仅两三行。
- 频繁调用的函数,如循环。
什么时候不可以内联:
- 非常大的函数,超过20行。
- 递归函数。
19 Const
const:变量初始化后不能再被修改。但其仍是变量而不是常数。
传递一个完整的对象会产生很多花费,最好通过指针进行地址传递。但是程序员可能在使用时修改原始值,所以安全起见应该将其设为const常量。
区分:
*const对象是const:指向的地址可以修改,地址里的内容不能修改。
const*指针是const:地址里的内容可以修改,指向的地址不能修改。
20 不可修饰的对象
在函数后加上const:保证函数的成员变量不被修改。
使用时在声明和定义中都要说明。如下: