C++ 构造器

来源:互联网 发布:原生js图片上传 编辑:程序博客网 时间:2024/06/05 08:12

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对象

当用户没有定义构造器时,编译器会自动提供一个默认构造器,这个构造器什么都没有做,无须传递参数,所以在用户没有定义构造器时,声明对象s (point s)的方式是正确的;当用户定义了构造器时,编译器酒不再提供默认的构造器了,而是用用户定义的构造器构造对象。构造器是可重载的,当用户定义了不同参数(也可为0个参数)的构造器时,用户声明一个对象,编译器会根据不同的参数选用不同的构造器.比如,实例2中的两种声明对象方法都是正确的。而对于实例1中声明对象的方式(point 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规范,这里不再做讨论。





0 0