【学习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ㄒ)/~~)。
构造函数的创建
构造函数需要由程序员来创建,具体的声明与定义方法与类中的成员函数的声明与定义方法相同,但是需要注意构造函数的名称与类名相同。假设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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性