C++ 3 构造函数与析构函数
构造函数
- 系统在定义对象时自动调用
- 构造函数的名字与它的类名必须相同
- 没有类型,没有返回值,不写
void
- 写了构造函数,系统不提供默认构造函数
- 构造函数可重载,但有
带默认参数
的构造函数时,要注意避免歧义性 - 常数据成员只能通过构造函数的参数初始化表来进行初始化
- 静态数据成员只能在类体外初始化,不能用参数初始化表对其进行初始化
- 构造函数不能声明为虚函数,因为在执行构造函数时,类对象还未完成建立过程,因此谈不上把函数与类对象的绑定
默认构造函数
- 默认构造函数,无参,无函数体,也不做初始化工作
//类内定义
Box(){} //不带参数,默认构造函数
用于初始化的构造函数
//类内定义
Box(){ //类内定义,不带参数
height = 0;
width = 0;
}
Box(int h, int w){ //类内定义,带参数
height = h;
width = w;
}
Box(int h = 10, int w = 10){ //类内定义,带默认参数
height = h;
width = w;
}
Box(int h, int w): height(h), width(w){} //类内定义,参数初始化表
//类外定义
Box(); //类内声明,不带参数
Box(int, int); //类内声明,带参数
Box(int h, int w); //类内声明,带参数
Box(int = 10, int = 10); //类内声明,带默认参数
Box(int h = 10, int w = 10); //类内声明,带默认参数
//类外定义
Box::Box() //类外定义,不带参数
{height = 0; width = 0;}
Box::Box(int h, int w) //类外定义,带参数、带默认参数
{height = h; width = w;}
Box::Box(int h, int w): height(h), width(w){} //类外定义,参数初始化表
//调用
Box box1; //应用带默认参数、无参构造函数
Box box2(4); //应用带默认参数构造函数
Box box2(4, 5); //应用带默认参数、带参数构造函数
转换构造函数
- 转换构造函数只能有一个参数
- 标准类型数据
->
类的对象 - 其他类的对象
->
类的对象
//定义
Complex(double r){real = r; imag = 0;}
//调用
Complex c1(3.6);
c1 = Complex(3.6);
//定义
Teacher(Student& s){num = s.num; name = s.name;}
复制构造函数
//类内定义
Box(const Box& b){
height = b.height;
width = b.width;
}
//类外定义
//声明
Box(const Box&);
//定义
Box::Box(const Box& b){
height = b.height;
width = b.width;
}
//调用
Box box2(box1);
Box box2 = box1;
void fun(Box b){...} //Box 为函数形参
Box fun(...){...} //Box 为函数返回类型
派生类的构造函数
析构函数 ~
- 函数中定义一个对象(若为自动局部对象),函数调用结束,对象释放前自动执行析构函数
- 静态
static
局部对象,在函数调用结束时不释放,只在main
函数结束或调用exit
函数时才执行析构函数 - 全局对象,在
main
函数结束或调用exit
函数时才执行析构函数 new
了一个对象,当delete
时调用析构函数- 析构函数的作用不是删除对象,是在撤销对象占用内存之前完成一些情节工作,使这部分内存可以被程序分配给新对象使用
- 无返回值,无函数类型,无参数,不能重载
- 在同一作用域中,先构造的后析构,后构造的先析构,先进后出
~Box(){...}
默认析构函数
- 默认析构函数,无函数体,写了析构函数,系统不提供默认析构函数
~Box(){}
虚析构函数
参考资料
- [1]谭浩强.C++面向对象程序设计(第2版)北京:清华大学出版社,2014.
C++ 1 基础知识
C++ 2 组合与继承
C++ 3 构造函数与析构函数
C++ 4 引用、指针、常量、静态、友元
C++ 5 多态性
C++ 6 输入输出流