构造函数与析构函数

在C++中对象的初始化与清理工作分别由两个特殊的函数来完成,他们就是构造函数与析构函数。

构造函数:

构造函数是在对象被创建时利用特定的值构造对象,并将对象初始化为一个特定的状态。
构造函数的函数名与类名相同,并且它没有返回值,而且构造函数一般被声明为公有函数。
如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,该构造函数的参数列表和函数体皆为空。但是如果类中声明了构造函数(无论有没有参数),编译器都不会再为之生成隐含的构造函数。
构造函数的作用:
(1)创建类对象
(2)初始化其值
构造函数执行的步骤:
(1)传参
(2)按照类中成员变量的声明顺序依次构造其成员
(3)执行构造函数的函数体

例:在一个Clock类中
如果没写构造函数,编译器默认加一个构造函数 其样子为
Clock()
{}
一般我们会写一个带参的构造函数来进行对象的初始化
Clock(int hour ,int minute,int second)
{
this->hour=hour;
this->minute=minute;
this->second=second;
}
有人可能会问,这里的this是什么东西,其实在构造函数中,系统会写一个隐形的形参,他接受的是这个对象的地址,这样我们就可以知道将传过来的hour等值赋给谁,就是this指向的地址中。
构造函数是支持重载的,所以我们可以写多个构造函数。
复制构造函数(拷贝构造函数):
在用已有对象来初始化新建对象时,我们会调用复制构造函数。
一般分为三种情况:
(1)当用类的一个对象去初始化该类的另一个对象时。
int main()
{
Point a(1,2);
Point b(a);//用对象a来初始化对象b,复制构造函数被调用
Point c=a;//用对象a来初始化对象c,复制构造函数被调用
return 0;
}
(2)如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。
void f(Point p)
{

}
int main()
{
Point a(1,2);
f(a);//函数的形参为类的对象,当调用函数时,复制构造函数被调用
return 0;
}
因为调用函数时参数为一个对象,所以相当于用实参a来初始化形参p 即相当于Point p=a;
(3)如果函数的返回值是类的对象,函数执行完成返回调用者时。
Point f()
{
Point a(1,2);
return a;//函数的返回值是一个类对象,返回函数值时,调用复制构造函数
}
int main()
{
Point b;
b=f();
return 0;
}
因为在函数中我们定义了一个类对象a,在函数结束时我们要返回类对象a的值,但是a的作用域只在函数中,函数结束时a被释放,所以系统将a的值赋给一个临时对象,用临时对象将值返回,定义临时对象并且赋初值时就是使用一个类对象初始化对象。

复制构造函数的一般方法:
class 类名
{
public:
类名 (形参表)://构造函数
类名(类名&对象名)://复制构造函数
……
};

类名 ::类名(类名&对象名)
{
函数体
}

析构函数

析构函数实在对象的生存周期结束的时刻自动被调用,用来删除释放该对象。
析构函数通常也是类的一个公有函数成员,他的名称是由类名前面加~构成,它没有返回值。
并且与构造函数不同,析构函数没有参数,所以他也就不能被重载,就是说一个类中只能有一个析构函数。
析构函数的执行步骤:
(1)执行析构函数函数体;
(2)按照类中成员变量声明顺序的逆序一次释放其成员。
例:一个Clock类的析构函数
class Clock
{
public:
~Clock();//析构函数
}

总的来说:
使用构造函数时注意避免调用复制构造函数的情况
可以根据自己的需求来重载构造函数
但是析构函数不能重载
进行对象传参时尽量用对象的引用,并在前面加Const

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值