定义构造器
- 回顾:之前我们讨论了使用面向对象的编程技术开发程序最基本步骤:
- 定义一个有属性和方法的类(模板)
- 为该类创建一个变量(实现)
构造器和通常方法的主要区别:
- 构造器的名字必须和它所在的类的名字一样
- 系统在创建某个类的实例时会第一时间自动调用这个类的构造器
构造器永远不会返回任何值
创建构造器,需要先把它的声明添加到类里:
1
2
3class Car {
Car( void );
}构造器没有任何返回值,甚至不用在前面写上void。
定义构造器本身
1 | Car::Car(void) // 不用写 void Car::Car(void) |
构造数组对象
数组可以是任何一种数据类型,当然也包括对象
- 如:
Car mycar[10];
- 调用语法依旧是:
mycar[x].running;
- 注:x代表着给定数组元素的下标。
- 每个类至少有一个构造器,如果你没有在类里定义一个构造器,编译器就会使用如下语法替你定义一个:
ClassName::ClassName() { }
- 这是一个没有代码内容的空构造器,除此之外,编译器还会替你创建一个副本构造器(
CopyConstructor
) - 构造器很重要,不可或缺首先car里构造器是黑色,然后用car里的方法,设置成黄色;
1
2Car mycar;
mycar.setColor(“Yellow”);
定义析构器
在创建对象时,系统都会自动调用一个特殊的方法,即构造器。
相应地,在销毁一个对象时,系统也应该会调用另一个特殊方法达到对应效果?没错,这就是析构器。
一般来说,构造器用来完成事先的初始化和准备工作(申请分配内存),析构器用来完成事后所必须的清理工作(清理内存)。
构造器和析构器两者相辅相成
构造器和析构器两者相辅相成,有许多共同之处。首先,析构器有着和构造器/类一样的名字,只不过前边多了一个波浪符“~”前缀。
1 | class Car |
析构器也永远不返回任何值
析构器是不带参数的。所以析构器的声明永远是如下格式:
~ClassName()
;
在我们刚刚的例子中析构器可有可无。但是在比较复杂的类里,析构器往往至关重要(可能引起内存泄露)。
例如某个类的构造器申请了一块内存,我们就必须在析构器里释放那块内存。
1 | #include <iostream> |