目录
构造函数
构造函数:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次.构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
特征如下:
1. 函数名与类名相同
2. 无返回值,连void都不用写
3. 对象实例化时编译器自动调用对应的构造函数
4. 构造函数可以重载
5. 如果当没有手动编写构造函数和析构函数,编译器会自动一个无参的默认构造函数和析构函数,一旦用手动编写编译器将不再生成
6. 对自定义类型成员,编译器会调用这个自定义类型的构造函数和析构函数,对自定义类型进行初始化,对基本类型则不会初始化
7. 默认构造函数只能有一个。默认构造函数:不传参数就可以调用的 -- 无参、全缺省、编译器自动生成
构造函数的定义:
class A{
public:
//Init();
A(){
...
}
A(int n){
...
}
private:
int a;
}
构造函数的使用:
A aa1; //调用无参的构造函数
A aa2(4); //调用有参的构造函数
调用无参时不加()的原因:
编译器无法区分是函数的声明还是定义一个对象(构造函数的调用)
A Func(); //返回值为A的函数声明
A aa3(); //err
定义构造函数时建议使用缺省参数:
class Date {
public:
//Date() {
// _year = 1;
// _month = 1;
// _day = 1;
//}
//Date(int year, int month, int day) {
// _year = year;
// _month = month;
// _day = day;
//}
Date(int year = 1, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
}
全缺省构造函数不能和无参构造函数同时存在:
当对象初始化不传参时,编译器不知道调用哪个
默认生成的构造函数和析构函数:
1、内置类型成员不做处理
2、自定义类型的成员,会去调用这个自定义成员的构造函数和析构函数
析构函数
析构函数:与构造函数功能相反,但析构函数不用手动调用,对象在出作用域时编译器会自动调用析构函数完成对象中资源的清理工作。析构函数不是清理对象,对象是定义在栈上的出了作用域自动销毁,析构函数用于清理动态开辟的空间
特征如下:
1. 析构函数名是在类名前加上字符 ~。
2. 无参数无返回值类型。
3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。自动生成的析构函数对内置类型的成员变量直接销毁,对自定义类型的成员变量会去调用这个成员变量的析构函数。注意:析构函数不能重载
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数
5.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类。有资源申请时,一定要手动写,对资源进行delete,否则会造成资源泄漏,比如Stack类。
定义:
class A {
public:
//Destroy();
~A() {
...
}
}