c++类的构造函数
c++的目标之一是让使用类对象就像使用标准类型一样, 也就是说,常规的初始化语法不适用于类型Stock:
int year=2001; struct thing { char *pn; int m; }; thing amabob={"wodget",-23}; Stock hot={"Sukie'Autos,Inc.",200,50.25};
不能像上面这样初始化Stock对象的原因在于,数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员。因此需要设计合适的成员函数,才能成功的将对象初始化。
一般来说,最好是在创建对象时对它进行初始化。列如,请看下面代码。
Stock gift; gift.buy(10,24,75)
就Stock类当前的实现而言,gift对象的company成员是没有值的。为此,c++提供了一个特殊的成员——类构造函数,专门用于构造新对象、将值赋给他们的数据成员。
声明和定义构造函数
现在需要创建Stock的构造函数。由于需要为Stock对象提供3个值,因此应为构造函数提供3个参数。程序可能只想设置company成员,而将其他设置为0;这可以使用默认参数来完成。因此,原型如下所示:
//constructor prototype with some default arguments Stock(const string &co,long n=0,double pr =0.0);
第一个参数是指向字符串的指针,该字符串用于初始化成员company.n和pr参数为shares和share_val提供值。注意没有返回类型。原型位于类声明的公有部分。
下面是构造函数的一种可能定义:
//constructor definition Stock::Stock(const string &co,long n,double pr) { company =co; if(n<0) { std::cerr<<"number of shares can't be negative;" <<company <<"shares set to 0.\n"; shares=0; } else shares=n; shares_val=pr; set_tot(); }
成员名和参数名
一种常见的做法是在数据成员名中使用m_前缀:
另一种,在成员名中使用后缀_:
无论哪一种做法,都可在公有接口中包含company和shares。
使用构造函数
c++提供了两种使用构造函数来初始化对象的方式。第一种方式是显示地调用构造函数:
Stock food=Stock("World Cabbage",250,1.25);
这将food对象的company成员设置为字符串“World Cabbage”,将shares成员设置为250,依次类推。
另一种方式是隐式地调用构造函数:
Stock garment("Furry Mason",50,2.5));
一般来说,使用对象来调用方法:
stock1.show();
但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。
默认构造函数
默认构造函数是在为提供显式初始值时,用来创建对象的构造函数。也就是说,它是用于下面这种声明的构造函数:
Stock fluffy_the_cat;
默认构造函数没有参数,因为声明中不包含值。但是当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。
实际上,通常应初始化所有的对象,以确保所有成员一开始就有已知的合理值。因此,用户定义的默认构造函数通常给所有成员提供隐式初始值。例如,下面是为Stock类定义的一个默认构造函数:
Stock::stock() { company="no name"; shares=0; share_val=0.0; total_val=0.0; }