C++构造函数称为构造器。构造器必须是公有的,若是私有的,编译会报错,因为在用户编写了构造函数后,编译器就不会再默认的构造函数初始化对象,而是用用户编写的构造器初始化对象,若用户编写的构造器为私有的,便会出现错误。
1.构造器是public的
2.构造器可以为内嵌函数
3.构造器可重载
4.构造器无返回值
5.构造器名和类名必须一致
6..在类中声明构造器,类外定义构造器格式:类名::类名(参数列表){}
eg1:
class point{
private:
int x,y;
public :
point(int x,int y){this->x=x;this->y=y;}
};
point n(1,2);//初始化n对象
n=point(3,4);//为n对象赋值
point *p=point(3,5);//new一个对象,并把对象地址赋值给p指针
point ss=point(3,5);//正确
point s;//错误,编译器调用point(x,x)构造器发现有两个参数,而用户并没有传递参数,造成错误。
若定义了构造器,之声明一个对象无初始化便会报错,eg point n;报错除非定义在无参数的构造函数。。
比如:eg2:
class point{
private:
int x,y;
public :
point(int x,int y){this->x=x;this->y=y;}
point(){this->x=0;this->y=0;}
};
point s;//正确,编译器调用point()构造器,构造s对象
point n(2,3);//正确,编译器调用point(x,y)构造器
eg3:
class point{
private:
int x,y;
};
point s;//正确,编译器会自动提供一个默认构造器,构造s对象
C++98不支持在初始化对象以及调用构造器时用{}代替(),:point n{1,3}; point pp=point{3,4}; C++98也不支持point po={3,2};这几个方式 符合c++0x规范,若编译器 支持c++0x规范即可通过编译。
c++0x有一个代理构造器:
class point{
private:
int x,y;
public :
point(int x,int y){this->x=x;this->y=y;}
point():point(0,0){}//代理构造器
};
其中point():point(0,0){}声明了一个默认构造器point(),但它把工作转交给了另一个构造器:它调用了那个有两个参数的构造器并把输入参数值(0,0)传递给了后者。这是c++0x规范,这里不再做讨论。