C++构造函数简述

来源:互联网 发布:变女声软件 编辑:程序博客网 时间:2024/06/05 03:16

构造函数,主要用来创建对象时初始化对象,即为对象成员变量赋初始值。构造函数可以分为无参构造函数、有参构造函数、重载构造函数、默认构造函数。除此之外还有初始化列表、拷贝构造函数。
我们首先写一个Coordinate类,其中包括构造函数(略)、析构函数、数据成员m_ix和m_iy。

class Coordinate{public:    /******************/ //构造函数    ~Coordinate()//析构函数    {        cout<<"~Coordinate()"<<endl;    }private:    int m_ix;//数据成员    int m_iy;};

1、无参构造函数
构造函数不需要输入任何参数,直接给成员变量赋一个初始化值,此时会有一个赋值的成员函数。代码如下

Coordinate::Coordinate()//无参构造函数    {        cout<<"Coordinate()"<<endl;        m_ix=3;//赋初始化值,也可以不在这块初始化        m_iy=4;    }

此时,定义一个Coordinate对象的方法

Coordinate coor();//栈实例化Coordinate *pCoor=new Coordinate();//堆实例化

2、有参构造函数
构造函数中需要输出参数,参数可以包含默认值
(1)没有默认值的情况

 Coordinate::Coordinate(int x,int y)//有参构造函数,没有默认值    {        cout<<"Coordinate()"<<endl;        m_ix=x;        m_iy=y;    }

此时,定义一个Coordinate对象的方法

Coordinate coor(3,4);//栈实例化Coordinate *pCoor=new Coordinate(3,4);//堆实例化

(2)有默认值的情况
默认值的情况,遵循C++中函数参数默认值的规则。

Coordinate::Coordinate(int x=3,int y=4)//有参构造函数,有默认值    {        cout<<"Coordinate()"<<endl;        m_ix=x;        m_iy=y;    }

此时,定义一个Coordinate对象的方法

Coordinate coor1();//栈实例化,赋予默认值Coordinate *pCoor1=new Coordinate();//堆实例化,赋予默认值Coordinate coor2(56);//栈实例化,不赋予默认值Coordinate *pCoor2=new Coordinate(7);//堆实例化,y不赋予默认值

3、重载构造函数
一个类的构造函数可以包含很多个,形成重载的效果,即上述所有形式的组合。当实例化一个对象时,会根据实例化的形式自动选择适当的构造函数。

Coordinate::Coordinate()//无参构造函数Coordinate::Coordinate(int x,int y)//有参构造函数,没有默认值Coordinate::Coordinate(int x=3,int y=4)//有参构造函数,有默认值Coordinate::Coordinate(int x,int y=4)//有参构造函数,有默认值

4、默认构造函数
在实例化对象时,无需传入参数,即可以实现实例化。所以无参构造函数和所有数据成员都包含默认值的有参构造函数是默认构造函数。

//默认构造函数//形式1Coordinate::Coordinate()//无参构造函数    {        cout<<"Coordinate()"<<endl;        m_ix=3;//赋初始化值,也可以不在这块初始化        m_iy=4;    }//形式2Coordinate::Coordinate(int x=3,int y=4)//有参构造函数,有默认值    {        cout<<"Coordinate()"<<endl;        m_ix=x;        m_iy=y;    }

5、初始化列表
初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表。
除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表:

  • 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
  • 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
  • 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
Coordinate(int x,int y):m_ix(x),m_iy(y) {}//对应有参构造函数Coordinate():m_ix(3),m_iy(4) {} //对应无参构造函数Coordinate(int x=3,int y=4):m_ix(x),m_iy(y) {}//包含默认值的有参构造函数

6、拷贝构造函数
考虑下面的Coordinate类

class Coordinate{public:    Coordinate(int x,int y)//构造函数    {        cout<<"Coordinate()"<<endl;        m_ix=x;        m_iy=y;    }    ~Coordinate()//析构函数    {        cout<<"~Coordinate()"<<endl;    }private:    int m_ix;    int m_iy;};

当我们执行下面的语句实例化对象时

Coordinate coor1(3,4);Coordinate coor2=coor1;
//输出结果Coordinate()

结果只执行一次构造函数,原因在与实例化coor2并不调用默认的构造函数,而是调用的拷贝构造函数(如果没有,系统会生成一个默认的拷贝构造函数)。
拷贝构造函数形式

  Coordinate(const Coordinate & coor)    {        cout<<"const Coordinate()"<<endl;    }

输出结果

Coordinate()const Coordinate()
原创粉丝点击