构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。构造函数是用来保证每个对象的数据成员具有合适的初始值。如下
Class Sales_item{
Public:
Sales_item(): units_sold(0);revenue(0.0){}
Private:
std::string isbn;
unsigned units_sold;
double revenue;
};
如果看过我前面两篇文章的朋友会发现 这个案例其实我在前面说过。从上可以看出,构造函数的名字必须与类名相同,并且不能指定返回类型。请其他任何函数一样,可以没有形参,也可以定义多个形参。Sales_item(): units_sold(0);revenue(0.0){}----->这个构造函数使用构造函数初始化列表来初始化unist_sold和revenue成员。
构造函数可以被重载,这就说明可以为一个类声明的构造函数的数量是没有限制的,但是得遵循重载的定义 即参数的类型和个数不能一样。如下
Class Sales_item{
Public:
Sales_item(const std::string&):
Sales_item(std::istream&);
Sales_item();
};
定义了那么多 到底应该调用哪个呢?实参决定调用的是哪个构造函数。构造函数是自动执行的,没创建该类型的一个对象,编译器就会运行一个构造函数。
与其他任何函数一样,构造函数具有名字,形参表和函数体。与其他函数不一样的是,构造函数也可以包含一个构造看书初始化列表:
Sales_item::Sales_item(std::string &book):isbn(book), units_sold(0), revenue(0.0) {} “构造函数初始化列表”以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化。
Sales_item::Sales_item(std::string &book)
{
isbn = book;
units_sold = 0;
revenue = 0.0;
}
上面案例说明构造函数省略初始化列表并在构造函数的函数体内对数据成员赋值是合法的。但是注意,有些成员必须在构造函数的初始化列表中进行初始化。对于这样的函数 在构造函数的函数体内对它们赋值不起作用。例如---->没有默认构造函数的类类型成员,以及const或引用类型成员。