构造函数
来源:互联网 发布:国泰安股票收益率数据 编辑:程序博客网 时间:2024/05/21 09:16
1.构造函数的名字与类的名字相同,并且不能指定返回类型。像其他任何函数一样,它们可以没有形参,也可以定义多个形参。
2.构造函数不能声明为const。创建类类型的const对象时,运行一个普通构造函数来初始化该const对象。
3.两种形式
Sales_item::Sales_item(const string&book):
Isbn(book),units_sold(0),revenue(0.0){} //所谓初始化列表
省略初始化列表并在构造函数的函数体内对数据成员赋值是合法的。
Sales_item::Sales_item(const string&book)
{
Isbn= book;
units_sold= 0;
revenue= 0.0;
}
4.没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
5.默认构造函数
一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数(合成的构造函数)。
内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才初始化。当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化。(指针或复合类型的特点)
6.隐式类类型转换
单个实参调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
如:
string null_book = “9-99-999-9999”;
item.same_isbn(null_book);
编译器使用接受一个string的Sales_item构造函数从null_book生成一个新的Sales_item对象。新生成的(临时的)Sales_item被传递给same_isbn。一旦same_isbn结束,就不能再访问它。
如何抑制由构造函数定义的隐式转换?
答案是用explicit。explicit关键字只能用于类内部的构造函数声明上。
为转换而显示地使用构造函数
item.same_isbn(Sales_item(null_book));
参考:《C++ primer》