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