构造函数
- 函数名和类名完全相同
- 没有返回类型
- 作用:初始化类的对象
- 一个类可以有多个构造函数
- 创建类的对象时,自动调用类的构造函数
- 创建一个对象时只调用一个构造函数(根据参数列表)且只在创建时调用一次
- 构造函数可以确保对象在使用前被初始化
析构函数
- 函数名和类名相似(前面多了一个字符“~”)
- 没有返回类型
- 没有参数
- 析构函数不能被重载
- 作用:撤销对象前做清理工作,一般是释放对象在生存期间动态申请的空间
- 撤销类的对象时,自动调用类的析构函数
访问控制
- 三个访问说明符:public、private和protected
- 作用——控制对类的成员的访问
- 在用class定义的类中,默认的访问方式是private
- 在类的定义中,三个访问说明符都可以使用多次(不提倡)
例子1:带默认参数
//文件circle.h
#if !defined __CIRCLE__H__
#define __CIRCLE__H__
#include <iostream>
using namespace std;
class Circle
{
public:
//带默认参数的构造函数
Circle(double a = 5.0, double b = 5.0, double c = 5.0)
{
x = a;
y = b;
if (c>0) r = c;
else r = 5.0;
};
void draw()
{
cout<<"Draw a circle at (" << x << ","
<<y<<"), with radius "<<r<<"."<<endl;
};
private:
double x, y; //x、y坐标
double r; //半径
};
#endif
n
用例子1中的类Circle声明对象
Circle a;
//相当于 Circle a(5.0, 5.0, 5.0);
Circle b(1.0);
//相当于 Circle b(1.0, 5.0, 5.0);
Circle c(3.0, 4.0);
//相当于 Circle c(3.0, 4.0, 5.0);
Circle d(4.0, 5.0, 6.0);
//相当于 Circle d(4.0, 5.0, 6.0);
复制构造函数
- 根据类的某个对象复制出一个完全相同的新对象的构造函数叫复制构造函数
- 复制构造函数的参数是该类的对象,一般使用传引用的方式
//文件circle.h
#if !defined __CIRCLE__H__
#define __CIRCLE__H__
#include <iostream>
using namespace std;
class Circle
{
public:
//带默认参数的构造函数
Circle(double a = 5.0, double b = 5.0, double c = 5.0)
{
x = a;
y = b;
if (c>0) r = c;
else r = 5.0;
}
//复制构造函数
Circle(Circle &c)
{
x = c.x;
y = c.y;
r = c.r;
}
void draw()
{
cout<<"Draw a circle at ("<<x<<","<<y <<"), with radius "<<r<<"."<<endl;
}
private:
double x, y; //x、y坐标
double r; //半径
};
#endif
使用复制构造函数
Circle a(3.0, 4.0, 5.0);
Circle b(a);
析构函数执行的时机
- 对象被撤销时,类的析构函数被自动调用
- 全局对象在所有程序执行完毕之后被撤销(执行完main函数最后一条语句或执行exit语句之后)
- 如果程序以abort语句终止执行,全局对象的析构函数不被执行
- 局部动态对象在退出该对象的作用域时被撤销
- 如果程序在退出该程序块之前以exit或abort终止执行,局部动态对象的析构函数不会执行
- 局部静态对象在程序执行完毕后或程序执行exit语句之后,其析构函数被执行
- 如果程序以abort语句终止执行,局部静态对象的析构函数不被执行
- 局部静态对象的析构函数在全局对象的析构函数执行之前执行
- 动态创建对象的析构函数在执行相应的delete操作时执行
- 如果程序不使用delete释放动态创建的对象,该对象不会被释放
例子2:编程演示构造函数和析构函数的执行时机
//文件createanddestroy.h
#if !defined __CREATEANDDESTORY__H__
#define __CREATEANDDESTORY__H__
#include <iostream>
using namespace std;
class CreateAndDestroy
{
public:
CreateAndDestroy(int n)
{
no = n;
cout<<"Object "<<no<<" created!"<<endl;
}
~CreateAndDestroy()
{
cout<<"Object "<<no<<" destructed!"<<endl;
}
private:
int no;
};
#endif
//文件ex11_6.cpp
#include "createanddestroy.h"
CreateAndDestroy one(1); //定义全局对象one
int main()
{
CreateAndDestroy *ptr;
CreateAndDestroy two(2); //定义局部动态对象two
{
CreateAndDestroy three(3);//局部对象three
ptr = new CreateAndDestroy(4); //动态对象
static CreateAndDestroy five(5); //静态对象
}
delete ptr; //释放动态创建的对象
return 0;
}
程序运行结果:
Object 1 created!
Object 2 created!
Object 3 created!
Object 4 created!
Object 5 created!
Object 3 destructed!
Object 4 destructed!
Object 2 destructed!
Object 5 destructed!
Object 1 destructed!