1、 C++中构造函数的调用方式主要分为两类:
1)显示调用:
eg: Stock food = Stock("360",250,2.5);
2)隐式调用;
eg:Stock food("360",250,2.5);
注意:显示调用构造函数大多编译器理解为对food进行初始化,这也是最正确的理解方式,因此直道food所在的作用域到达尽头,才调用析构函数进行清理;而有的编译器将Stock food = Stock("360",250,2.5;理解为:先创建一临时对象,然后将其赋值给food,然后在删除临时对象。如果是这样,则会调用一次析构函数,对对象进行清理。这种创建方式和 food = Stock("360",250,2.5比较相似,即对food进行复位。
C++11新标准,增添了对象的列表初始化:
eg:Stock food = {"360",250,2.5};
eg:Stock food {"360",250,2.5};
2、 默认构造函数:
默认构造函数分为三类:
1)声明类时,程序员不声明任何构造函数,则编译器为该类增添一不含任何参数的构造函数,该构造函数也不对该类的任何成员变量进行初始化,即:成员变量的值未被初始化。
2) 声明类时,程序员声明一个不含参数的构造函数,该构造函数可以对类成员变量进行默认初始化;
3)声明类时,程序员声明一个含默认参数的构造函数,那么定义对象时成员变量将被默认参数初始化;
注意:只有在程序员不声明任何构造函数的情况下,编译器才会为类增添一个不含任何参数的默认构造函数,如果程序员偷懒,定义对象时:Stock food;则编译器将报错,因此为了编译成功,程序员最好为类增添一个隐式初始化的默认构造函数。若添加两个默认构造函数,则在调用默认构造函数初始化对象时会出错,编译器不知道调用哪一个。
3、默认构造函数的调用:
eg: Stack food;
eg: Stack food();//典型错误方法
eg:Stack food = Stack();
默认构造函数写法最简单,因此程序员最好为类增添一个默认构造函数啊!
4、复制构造函数
当时用一个对象类初始化另一个对象时,编译器将自动生成复制构造函数。该函数将生成一个副本对象,并将该副本对象中的非静态数据成员拷贝给要初始化的对象,因此,忽视了对静态成员的处理,容易引发难以检查的错误。
eg: Stock food = Stock("360",250,2.5);
将调用复制构造函数,对food进行复制初始化。