您的位置:首页 > 编程语言 > C语言/C++

【学习C++】3.构造函数

2016-05-04 22:08 381 查看
    在C++中,程序在声明一个类的对象时,自动调用构造函数。在构造函数创造出对象之前,对象是不存在的,构造函数的作用是创造对象,所以称之为构造函数。构造函数是不能通过对象来调用的。

构造函数的创建

    构造函数需要由程序员来创建,具体的声明与定义方法与类中的成员函数的声明与定义方法相同,但是需要注意构造函数的名称与类名相同。假设Stock是程序员定义的一个类,则在Stock的类声明中对构造函数进行声明:       

                                             Stock(const string &co,long n,double pr);       (1)

用如下方式对构造函数进行定义(前一个Stock是类名,后一个Stock是构造函数的名称,两者相同):

                                             Stock::Stock(const string &co,long n,double pr){......}        (2)

如果程序员没有显示的创建函数,则编译器会提供一个默认构造函数来创建对象。

默认构造函数

    构造函数除了创造对象之外的另一个可选择的重要作用是初始化类中的数据成员。当代码中提供了构造函数时,一般会在构造函数中对类的数据成员进行初始化。此时创建类的一个对象时需要调用构造函数来对类成员进行初始化,有下面两种方式:

                                             Stock s1(“Furry Mason”,50,2.5);(隐式调用)       (3)

                                             Stock s1=Stock(“Furry Mason”,50,2.5);(显式调用)       (4)

   

    当程序员没有定义构造函数时,则编译器会提供一个默认构造函数来进行对象的创建,创建类的一个对象时可以用如下方式:  Stock s;此时将创建s对象但不初始化其数据成员。就像int x;语句创建int型的x但不给它提供初值一样。默认构造函数的形式为 Stock::Stock();默认构造函数什么也不做,只起到了创建对象的作用。因此Stock s;与Stock s=Stock();这两种表达方式等价。

   但是如果程序员定义了构造函数,并且构造函数是(2)的形式,即向构造函数中传递了参数,则创建对象时如果采用 Stock s;这种方式将会出错,此时编译器不在提供默认构造函数,创建对象时必须使用(2)构造函数,而Stock s;如果调用(2)构造函数会出错,以为(2)是有参数的构造函数而其试图调用一个没有参数的构造函数,此时编译器也不再提供默认构造函数,所以这种创建方法将会出错。此时创建对象时只能用(3)或者(4)的方式创建。

    如果程序员定义了构造函数以后还是想要以Stock s;这种方式来创建对象的话,就要程序员自己来定义默认构造函数了(其实就是不带参数的构造函数),自己定义默认构造函数的方式有两种,一种是给已有构造函数的所有参数提供默认值,这时创建对象时调用的构造函数相当于是传递了默认值的构造函数:

                           Stock(const string & co=“no name”,int n=0,double pr=0.0);(只需将构造函数的声明改为这种形式)

第二种方式是通过函数重载定义一个不带参数的构造函数 Stock();如:

                               Stock::Stock(){company="no name";shares=0;share_val=0.0}        (5)

    当程序员自己定义了不带参数的构造函数(默认构造函数)时,当用这种语句Stock s;创建对象时,就会自动调用程序员自定义的默认构造函数。程序员自定义的默认构造函数一般会在构造函数中对类中的数据成员进行初始化(虽然程序员自定义的默认构造函数不带参数,但是不用所参数也可以在函数内部对数据成员进行初始化,如(5)),而编译器所提供的默认构造函数什么都不做,只起创建对象的作用。

    感觉自己总结的有一点模糊,语言表达的不太顺畅,不过没关系自己以后能看懂就行(希望以后自己能看懂/(ㄒoㄒ)/~~)。

                                                                                  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++