十四、类与对象:构造函数和析构函数

本文详细阐述了构造函数、拷贝构造函数和析构函数的作用、特点及使用场景。通过具体示例,深入浅出地解释了它们在对象生命周期管理中的关键角色,帮助开发者更好地理解和掌握类对象初始化和销毁的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.构造函数
什么是构造函数?
	如声明变量初始化一样,声明对象也要初始化。但类对象相对复杂,所以我们需要构造函数实现。其作用就是在对象创建时利用特定初始值构造对象,在对象创建时由系统自动调用。
需要注意的是:
	a、构造函数一般声明为公有函数,除非我们不允许某个类生成对象,那么我们可以将其生成为private或protected。
	b、每个类编译器为其生成默认构造函数,但只要我们自己定义了构造函数,编译器就不会为它生成默认构造了。同时构造函数是成员函数,具有成员函数的功能,如直接访问所有数据成员,可以是内联的,带形参,可以带默认形参,也可以重载简单示例:
Clock
{
         public:
         Clock(intNewH,int NewM,int NewS); //构造函数,带3个形参
…..
         private:
….
         intHour,Minute,Second;
}
Clock:: Clock(int NewH,int NewM,int NewS)  //构造函数实现
{
         Hour=NewH;
         Minute=NewM;
         Second=NewS;
}
Clock(0,0,0);     //隐含调用构造函数,初始值为3个实参

2.拷贝构造函数
什么时拷贝构造函数?
如同用一个变量初始化另一变量一样,类也有相似操作。拷贝构造函数就是用一个已有对象去初始化另一个对象。这两个对象类型应该是一样的。
类名(类名& 对象名);  //形参是本例对象的引用
简单示例:
#include <iostream>
using namespace std;
class Point
{
public:
	Point(int x=1,int y=1){X=x;Y=y;}
	Point(Point &p);
	int GetY(){return Y;}
	int GetX(){return X;}
private:
	int X,Y;
};
Point::Point(Point &p)
{
	X=p.X;
	Y=p.Y;
	cout<<"拷贝构造函数调用"<<endl;
}
int main()
{
	Point p1(1,2),p2;
	p2=p1;  //这里我们发现没有调用拷贝构造函数,在这种情况下实际是=操作符
	        //也就是=的重载函数,即拷贝复制
	Point A(1,2);
	Point B(A);  //拷贝构造函数
	return 0;
}
那在什么情况下会调用该函数?主要有以下几种情况
a、当用类的一个对象去初始化另一个对象时自动调用。注意这时是初始化,如果是=的话,就是上面示例中的拷贝复制而非拷贝构造了。
Point A(1,2);   Point B(A);

	b、函数形参为类对象,调用函数时,实参值赋值给形参,系统自动调用拷贝构造。
Point A(1,2); fun(A);

	c、函数返回值是类对象
Point fun(){Point A(1,2);return A;}
B=fun();
	这种情况很容易理解,因为A是局部对象,在函数结束的就释放。B=fun()的实际执行过程是return A首先A调用构造拷贝,拷贝给一个临时对象,然后临时对象值再拷贝给对象B。

3.析构函数
什么是析构函数?
	和构造函数相反,析构函数做对象删除前的清理工作。在对象被删除时系统自动调用。同时在用户未定义时系统会自动生成默认的,但默认析构什么也不做。
	需要注意的是析构函数不能有返回值也不能有任何形参
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值