构造函数
构造函数在对象创建时由系统自动调用。它的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。构造函数允许是内联函数,重载函数,带默认形参值的函数。
构造函数的名字与它所属的类名相同,一般被声明为公有函数(如果不希望类外直接调用构造函数,也可声明为私有函数或保护函数)。构造函数没有返回类型,即使写void
也不可以!
/*构造函数举例*/
#include <iostream>
using namespace std;
class Point{
public:
Point(int X,int Y);
void setPoint(int initX,int initY);
int getX();
int getY();
private:
int x,y;
};
Point::Point(int X,int Y){
x = X;
y = Y;
}
void Point::setPoint(int X,int Y){
x = X;
y = Y;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
int main(void)
{
Point p1(0,0),p2(0,0);//自动调用构造函数
cout<<"p1的坐标" <<p1.getX()<<','<<p1.getY()<<endl;
cout<<"p2的坐标" <<p2.getX()<<','<<p2.getY()<<endl;
p1.setPoint(30,50);
p2.setPoint(10,20);
cout<<"p1的坐标" <<p1.getX()<<','<<p1.getY()<<endl;
cout<<"p2的坐标" <<p2.getX()<<','<<p2.getY()<<endl;
return 0;
}
运行结果如下:
构造函数可以重载
/*重载构造函数例子*/
#include <iostream>
using namespace std;
class Point{
public:
Point(); //缺省样式的构造函数
Point(int X,int Y); //带参数的构造函数
void setPoint(int initX,int initY);//设置点坐标
int getX();
int getY();
void setX(int X);
void setY(int Y);
private:
int x,y;
};
Point::Point(){
x = 0;
y = 0;
cout<<"缺省样式的构造函数调用完毕!"<<endl;
}
Point::Point(int X,int Y){
x = X;
y = Y;
cout<<"带参构造函数调用完毕!"<<endl;
}
void Point::setPoint(int X,int Y){
x = X;
y = Y;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
void Point::setX(int X){
x = X;
}
void Point::setY(int Y){
y = Y;
}
int main(void)
{
Point p1,p2(0,0);
cout<<"p1的坐标:"<<p1.getX()<<','<<p1.getY()<<endl;
cout<<"p2的坐标:"<<p2.getX()<<','<<p2.getY()<<endl;
p1.setPoint(30,50);
p2.setX(10);
p2.setY(20);
cout<<"p1的坐标:"<<p1.getX()<<','<<p1.getY()<<endl;
cout<<"p2的坐标:"<<p2.getX()<<','<<p2.getY()<<endl;
return 0;
}
运行结果如下:
如果程序未声明构造函数,则系统自动产生一个默认形参的构造函数,称为缺省构造函数。缺省构造函数不能对对象中的数据进行一下有效的初始化,只能给对象开辟一个存储空间。
一旦在程序中声明了构造函数,系统将不再提供缺省构造函数。
但是,我们可以模仿缺省构造函数的样式,声明一个不带参数的构造函数,称之为"缺省样式的构造函数"。"缺省样式的构造函数"和"缺省构造函数"的函数原型完全一致,但是可以有不同的函数体。