数据部分的访问状态是私有的,不能像其他数据类型那样初始化。程序只能通过成员函数来访问数据成员,因此要设计合适的成员函数来将对象初始化。
为此,C++提供了一个特殊的成员函数—类构造函数。
构造函数的申明和定义:
//constructor 构造函数,没有返回类型。原型位于类声明的共有部分
#include<iostream>
#include<string>
#include<cstring>
class Stock {
//class declaration
private:
char company[30];
int shares; //股份
double share_val;
double total_val;
//定义位于类声明中的函数自动成为内联函数,省去了调用函数的步骤
//void set_tot() { total_val = shares * share_val; }
void set_tot();
public:
Stock(); //default constructor 默认构造函数
Stock(const char *co, int n, double pr); //constructor构造函数,没有返回类型。原型位于类声明的共有部分
//~Stock();
void acquire(const char *co, int n, double pr);
void buy(int num, double price);
void sell(int num, double price);
void update(double price);
void show();
}; //note semicolon at the end
//内联函数也可以写在类声明之外,内联函数的特殊规则要求每个使用他们的文件都对其进行定义,
//因此简便的方法是:将内联定义放在定义类的头文件中
inline void Stock::set_tot()
{
total_val = shares * share_val;
}
构造函数定义 constructor definition
//默认构造函数,当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。
//在设计类时,通常应提供对所有类成员做隐式初始化的默认构造函数
Stock::Stock(){
std::strcpy(company, "no name");
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
//构造函数,代码与acquire()函数相同,但区别在于,程序声明对象时,将自动调用构造函数。
Stock::Stock(const char *co, int n, double pr) {
std::strncpy(company, co, 29); //truncate co to fit company
company[29] = '\0'; //保证输入的是字符串
if (n < 0) {
std::cerr << "number of shares cannot be negative."
<< company << "shares set to be 0.\n";
shares = 0;
}