欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构造函数,拷贝构造函数和析构函数

程序员文章站 2022-07-15 17:00:47
...

构造函数

作用:创建类对象,初始化其值
构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊的性质:构造函数的函数名与类名相同,而且没有返回值,构造函数通常被声明为公有函数。
调用时无须提供参数的构造函数称为默认构造函数。也就是说,如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造参数,该构造函数的参数列表和函数体皆为空。
作为类的成员函数,访问类的所有数据成员,可以是内联函数,可以带有参数表,可以带默认的形参值,也可以重载。
例如:

classc Cock
{
ppublic:
Clock(int h,int m,int s);
Clock()
{
_h=0;
_m=0;
_s=0;
}
void setTime(int h,int m,int s);
void showTime();
private:
int _h,int_m,int_s;
};
int main()
{
Clock c1(0,0,0);//调用有参数的构造函数
Clock c2;//调用无参数的构造函数
}

执行顺序:
1。传参
2.函数可以直接按照类中成员变量声明顺序,依次构造其成员
3.执行构造函数函数体

拷贝构造函数

拷贝构造函数的形参是类的对象的引用。其作用是使用一个已经存在的对象,去吃实话同类的一个新对象。
声明和实现拷贝构造函数的一般方法
class 类名
{
public:
类名(形参名);//构造函数
类名(类名&对象名);//拷贝构造函数

};
类名::类名(类名&对象名);//拷贝构造函数的实现
{
函数体
}
普通构造函数实在对象创建时被调用,而拷贝构造函数是在以下三种情况下都会被调用。
1,当用类的一个对象去初始化该类的另一个对象时

int main()
{
Point a(1,2);
Point b(a);//用对象a初始化对象b,拷贝构造函数被调用
Point c=a;//用对象a初始化对象c,拷贝构造函数被调用
cout<<b.GetX()<<endl;
return 0;
}

2,如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。

void  f(Point p)
{
cout<<p.getX()<<endl;
}
int  main()
{
Point a(1,2);
f(a);//函数的形参作为类的对象,当调用函数时,拷贝函数被调用
return 0;
}

3,如果函数的返回值是类的对象,函数执行完成返回调用者时。

Point g()
{
Point a(1,2);//函数的返回值是类对象,返回函数值 时,调用拷贝构造函数
return a;
}
int main()
{
Point b;
b=g();
return 0;
}

析构函数(释放类对象)

它用来完成对象被删除前的一些清理工作。析构函数是在对象的生存期即将结束的时刻被自动调用的。它的调用完成之后,对象也就消失了,相应的内存空间也被释放。
执行顺序:
1.执行析构函数函数体
2.按照类中成员变量声明顺序的逆序,依次析构其成员