OOP04:Object Interactive
第4章 Object Interactive
构造函数的调用顺序:基类 → 成员变量 → 派生类
析构函数的调用顺序:派生类 → 成员变量 → 基类
4.1 构造函数
4.1.1 构造函数的作用
(1)函数名与类名相同
(2)通过编译器调用,进行初始化,保证实例化的类一定会初始化
class X{ |
4.1.2 构造函数的参数
class Tree{ |
(1)构造函数可以有很多个
(2)如果仅定义了一个带参数的构造函数,那么缺省构造函数会丢失,在实例化时,必须添加参数
struct Y{ |
(3)如果没有定义构造函数,系统会默认添加一个缺省构造函数auto default constructor
4.2 析构函数
4.2.1 析构函数的定义
(1)函数名为~类名()
(2)用于返回内存
(3)当对象超出作用域后,编译器自动调用析构函数
class Y{ |
(4)析构函数调用的唯一标志是右大括号
对象变量的作用域是一对大括号,出了作用域便会被销毁
class V{ |
4.3 内存分配
(1)在大括号的左括号处,编译器会分配所有的内存
(2)在定义对象的语句处,才会调用对象的构造函数
class X { |
4.4 抽象
(1)抽象:忽略部分细节,以将注意力集中在更高级别问题上
(2)模块化:将整体划分为明确定义的部分的过程,这些部分可以单独构建和检查,并且以明确定义的方式相互作用
4.5 局部变量
(1)局部变量是在函数内部定义的,其作用域仅限于它们所属的函数
(2)如果局部变量的名字与类的成员变量相同,则会使用局部变量而非成员变量
int TicketMachine::refundBalance() { |
4.5.1 字段(Fields),参数,局部变量
- 这三种类型的变量都能够存储适合于其定义类型的值。
- 字段(Fields)
- 字段在构造函数和方法之外定义。
- 字段用于存储贯穿一个工程生命周期的数据。因此,它们维护对象的当前状态。它们的生命周期和工程的生命周期一样长。
- 字段具有类作用域:它们的可访问性扩展到整个类,因此可以在定义它们的类的任何构造函数或方法中使用它们
- 一旦字段被定义为私有,它们就不能从定义类之外的任何地方访问。
- 形式参数和局部变量仅在构造函数或方法执行期间持续存在。它们的生存期仅相当于一次调用,因此在调用之间会丢失它们的值。因此,它们是临时的而不是永久的存储位置。
- 形参
- 形参定义在构造函数或方法的头文件中。它们从外部接收值,由构成构造函数或方法调用一部分的实际参数值初始化。
- 形式参数的作用域仅限于其定义的构造函数或方法。
- 局部变量
- 局部变量在构造函数或方法的函数体中定义。它们只能在其定义的构造函数或方法体中进行初始化和使用
- 局部变量在表达式中使用之前必须先初始化——它们没有默认值。
- 局部变量的作用域仅限于定义它们的块。从那个块以外的任何地方都无法进入。
4.6 初始化
4.6.1 Initializer list
class Point{ |
(1)可以初始化任意类型的数据
(a)相当于调用了析构函数
(b)避免了赋值操作
(2)初始化的顺序是写的顺序
(a)例如在例子中,先初始化y,后初始化x
(b)析构时,按照初始化的倒序
4.6.1 Initializer list 与 Assignment的区别
Student::Student(string s):name(s){} |
4.7 函数的重载
4.7.1 Overload
相同的函数,可以有不同的参数列表
void print(char * str, int width); // #1 |
4.7.2 Overload 和 auto-cast
void f(short i); //#1 |
4.8 缺省参数
Stash(int size, int initQuantity = 0); |
规定:缺省参数必须从右往左写
int harpo(int n, int m = 4, int j = 5); |
4.9 常量对象变量 const objects
4.9.1 定义
const Currency the_raise(42, 38); |
4.9.2 常量成员函数 const member functions
(1)不能改变对象内部的内容
(2)在函数内只能调用常量成员函数
int Date::get_day()const; |
4.9.3 常量成员变量
class A{ |
class HasArray{ |
4.10 函数变量中的class
4.10.1 传入参数
void f(Student i); |
4.10.2 返回值
Student f(); |
例:
//代码耦合性较强,需要在bar()中释放掉在foo()中分配的内存 |
修改:谁分配,谁销毁
void foo(char *p){ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论