目录
5.2.1 构造函数
(1)构造函数的定义:C++为用户提供专门用于对象初始化的函数。
(2)构造函数的特点:
1.构造函数与类名相同
2.构造函数在建立对象是自动建立
3.如果未定义构造函数,编译系统会生成一个默认形式的隐含的构造函数,该构造函数的函数体是空的,不具备任何功能。
4.如果定义了至少一个构造函数,编译系统便不会默认生成构造函数
5.构造函数没有返回值且无需用void,并且可以重载,用户可以根据参数个数或者参数类型的不同进行区分。
例如:
class Clock{
private:
int H,M,S;
public:
Clock(int h=0,int m=0,int s=0){//构造函数
H=h,M=m,S=s;
cout<<"constructor:"<<H<<":"<<M<<":"<<S<<endl;
}
该构造函数未初始化H M S均为0,其中还有cout的功能,在定义一个Clock对象时功能自动调用
5.2.2 析构函数
(1)析构函数的定义:析构函数是对象消失前自动调用的函数,其形式如:~构造函数名();
(2)析构函数的特点:
1.析构函数没有参数,无返回值,不可以重载
2.一个类只有一个析构函数,可以是虚函数
3.构造函数名是在类名前加一个“~”,以与构造函数区分
4.对象消失的清理工作并不是由析构函数完成的,而是析构函数中添加的清理语句完成。所以析构函数一般由用户自定义,由系统自动调用,如果没有定义,系统将生成一个不做任何事的默认析构函数
例如:
~Clock(){
cout<<"destructor:"<<H<<":"<<M<<":"<<S<<endl;
} //析构函数
对象在消失前会执行cout功能。
5.2.3 拷贝构造函数
(1)拷贝构造函数的定义:拷贝构造函数是特殊的构造函数,C++提供的拷贝构造函数用于建立新对象时将已经存在对象的数据成员复制给新对象。一般形式如: 类名(类名 & 对象名){}
(2)调用拷贝构造函数的情况:
1.当用类的一个对象初始化该类的另一个对对象
2.如果函数的形参是类的对象,在调用函数将对象作为函数实参传给函数的形参时。
3.如果函数的返回值是类的对象,函数执行完成时将返回值返回
例如:
Clock(Clock & p){ //拷贝构造函数
cout<<"copy constructor, before all:"<<H<<":"<<M<<":"<<S<<endl;
H = p.H;
M = p.M;
S = p.S;
}
实现拷贝。
以下是完整代码来分别展示各个函数
#include <iostream>
using namespace std;
class Clock{
private:
int H,M,S;
public:
Clock(int h=0,int m=0,int s=0){//构造函数
H=h,M=m,S=s;
cout<<"constructor:"<<H<<":"<<M<<":"<<S<<endl;
}
~Clock(){
cout<<"destructor:"<<H<<":"<<M<<":"<<S<<endl;
} //析构函数
Clock(Clock & p){ //拷贝构造函数
cout<<"copy constructor, before all:"<<H<<":"<<M<<":"<<S<<endl;
H = p.H;
M = p.M;
S = p.S;
}
void ShowTime(){
cout<<H<<":"<<M<<":"<<S<<endl;
}
};
Clock fun(Clock C){ //c是形参
return C;
}
int main() {
Clock C1(8,0,0);
Clock C2(9,0,0);
Clock C3(C1) ;
fun (C2);
Clock C4;
C4 = C2;
return 0;
}
运行结果为:
运行结果解释:
1 定义了C1 C2 两个对象,调用了构造函数 Clock(int,int,int),产生了运行结果1 2 行。
2 建立了对象C3,然后将已经初始化过的对象C1作为初始值去初始化C3(调用了拷贝构造函数),由于该拷贝函数先进行显示操作再进行赋值,故运行结果第三行显示随机数字。
3 使用fun 函数,返回值是一个类的对象,因此在返回前需要建立一个临时的返回对象来储存返回值,在建立对象时未初始化,出现4行的随机数字。在执行return C时将C的值赋值给临时对象,此时调用了复制构造函数。故第5行出现随机数字。
4 临时对象消失,调用析构函数,返回值对象消失,调用析构函数,故产生 6 7 行。
5 建立对象C4,调用构造函数,产生第8行。
6 剩下的9 10 11 12 行分别是C1 C2 C3 C4消失调用析构函数产生。
7 C4 =C2 语句中函数不被调用。