谈到C++的类,就必然少不了构造函数这个概念,下面是自己学习C++ primer后对构造函数一些知识点的总结和理解
在创建类对象的时候,必然要执行构造函数,构造函数的功能是保证每个对象的数据成员具有合适的初始化。构造 函数是特殊的成员函数,它的名字与类型名称相同,而且没有返回值类型。构造函数可以重载,构造函数不能声明为const,即使创建的对象是const的。因为不管对象是不是const,const只是防止修改对象的数据成员,而构造函数只是对对象的数据成员进行初始化,谈不上修改。
下面来举个书上的例子示意说明一下:
程序:
程序运行,采用初始化1的方式,我们可以看到如下结果:
原因是,此时对象初始化时调用的是Sales_item():units_sold(0),revenue(0.0){}。此处用到了构造函数初始化列表,后面详细说明。
但此处要注意,Sales_item item; 不要写成Sales_item item();,这样便成了声明一个item函数,而类体中没有这样的函数定义。
采用初始化2的方式,可以看到如下结果:
原因是,此时对象初始化时调用的是Sales_item(istream&a){string b; a>>b; isbn=b; units_sold=0;revenue =0.0;},用户可以通过输入一个字符串给isbn赋值。
采用初始化3的方式时,结果如下:
原因是此时调用的构造函数是Sales_item(const string &str):isbn(str),units_sold(0),revenue(0.0) {}。注意此处构造函数的形参最好使用const string &str,const引用,否则像程序中的字符串字面值的方式时非法的,因为字符串字面值是一个const的字符数组。如果使用string &str,只能用一个string类的对象进行初始化,会缩小构造函数的应用范围。
当初始化const对象时,如方式4,此时想上文所说的,不用将构造函数也声明为const,我们可以看下运行结果:
可以看到,const对象仍然可以调用Sales_item():units_sold(0),revenue(0.0){}进行正常的初始化。
在Sales_item():units_sold(0),revenue(0.0){}构造函数中我们可以接触到一个新的而又常被人忘记的概念,构造函数初始化列表。
构造函数初始化列表以一个冒号:开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟着一个圆括号的初始化式。
篇幅限制,具体总结见本人博客C++ 学习之构造函数:构造函数小结2