C++编程入门(二) 互动版

构造函数

构造函数是特殊的成员函数;在创建对象时首先由系统自动调用。它的作用是为新创建的对象分配空间,或为该对象的成员变量赋值等

构造函数名必须与其类名称完全相同,可以有参数用于给数据成员赋值,并且不允许有返回值。再来一颗栗子:

class Point
{
    public:
        Point(int a,int b);
        void setXY(int a,int b){x=a;y=b;}
        void move(int a,int b){x+=a;y+=b;}
        void printPoint(){cout<<"x= "<<x<<" y= "<<y<<endl;}
        int getX(){return x;}
        int getY(){return y;}
    private:
        int x,y;
};
Point::Point(int a,int b)
{
    x=a;
    y=b;
}

亲们看到第4行了吗?它声明了构造函数Point,其实构造函数的实现也可以放在声明部分,就像函数setXY那样。放在实现部分只是想让亲们看到"Point::"。

有了构造函数之后,我们在main函数中定义Point对象时,就可以Point p1(2,4);此时会调用构造函数,将p1的x赋值为2,p1的y赋值为4。这下了解构造函数是干嘛的了吧。

默认构造函数

不带任何参数的构造函数叫做默认构造函数。在定义类时没有定义任何构造函数时,C++编译器会自动生成一个不带参数的默认构造函数。这下知道了吧,所有类都是有构造函数的,即使你没写,C++也给你自动生成了一个呢

当然咯,你也可以自己写一个不带参数的构造函数,在函数体里面实现你的功能。这样C++就不会给你自动生成默认构造函数了。

默认参数

构造函数也是函数呀,当然可以把参数设置为默认的了。跟之前函数中学的一模一样呢。 这里简单举例如下(第4行),看不懂的面壁思过去。新建对象的时候可以是Point p1(2,4),p2(3); 对象p2的纵坐标y就是默认值3。

class Point
{
    public:
        Point(int a,int b=3){x=a;y=b;}
        void setXY(int a,int b){x=a;y=b;}
        void move(int a,int b){x+=a;y+=b;}
        void printPoint(){cout<<"x= "<<x<<" y= "<<y<<endl;}
        int getX(){return x;}
        int getY(){return y;}
    private:
        int x,y;
};

拷贝构造函数和默认拷贝构造函数

拷贝构造函数是一种特殊的构造函数,它的功能是用给一个已知的对象来初始化一个被创建的同类的对象。上面的构造函数有参数,用参数给对象的x和y赋值,而拷贝构造函数是用已有对象的x和y值,来对新建对象赋值。所以拷贝构造函数的参数当然是对象咯。

如果在一个类中没有定义拷贝构造函数,那么C++编译器会自动生成一个,并将已有 对象的所有数据成员的值,都赋值给自己的数据成员。拷贝构造函数的例子如下:

class Point
{
    public:
        Point(Point &point);//声明拷贝构造函数
        Point(int a,int b=3){x=a;y=b;}//声明并实现构造函数
        void setXY(int a,int b){x=a;y=b;}
        void move(int a,int b){x+=a;y+=b;}
        void printPoint(){cout<<"x= "<<x<<" y= "<<y<<endl;}
        int getX(){return x;}
        int getY(){return y;}
    private:
        int x,y;
};
Point::Point(Point &point)
{
    x=point.x;
    y=point.y;
}

第4行声明拷贝构造函数,参数是Point类型的对象的引用,也就是别名。第14行开始是实现,很简单,用对象point的xy值给自己赋值。

构造函数重载

亲们努力回忆下什么是函数重载?就是函数名相同,但参数必须有区别的多个函数。细心的同学发现了没?我们刚才是在重载构造函数啊,不信你去看看上例的第4行和第5行。构造函数也是函数呀,当然可以重载。编译器根据调用构造函数时的参数,选择执行那个构造函数。