构造函数的调用:
构造函数和普通函数调用有所区别,看以下生成类Clock对象的几条语句:
Clock c1;
Clock c2(8,25,30);
Clock c3=Clock(22,15,10)
Clock *p1,*p2;
p1=new Clock;
p2=new Clock(14,5,40);
第一行:类Clock的默认构造函数将被自动调用,意味着c1的数据成员被设置为0. 第二和第三行在声明一个对象时候进行初始化。第二行的格式应该优先使用,因为如果采用第三行的方式,编译器可能会生成一个临时的Clock的对象,随后拷贝给c3. 在倒数第二行,new用来动态的创建一个对象。由于没有哑元,缺省的构造函数将被调用初始化生成的对象。最后一行显示在动态创建时,也可以用参数进行初始化。
当我们创建一个数组,数组元素是对象时:
Clock cf[3]; // the default constructor is called
变量cf是有三个clock对象的数组。当此声明被执行时候,默认构造函数被每一个数组元素自动调用(没有参数的构造函数)。为了实现自动调用,必须有一个默认的构造函数。如果没有,将出现编译错误。当数组动态分配存储空间时候,也会自动调用默认构造函数。如,在下面语句中,默认构造函数将被调用5次:
p1 = new Clock[5]; //the default constructor is called
对象数组也可以用其他构造函数初始化,而不用默认的构造函数,如可以写成如下:
Clock aa[] = {Clock(9,35,20),Clock(14,55,50)};
我们将得到含两个对象的数组,他们两个都用带三个参数的构造函数初始化(临时的对象可能被生成,他们将被拷贝给aa的元素)。
如果一个类中包含了另一个类的对象,这些数据成员也可以用构造函数初始化。仍然以前面Flight类为例子:
//The file flight.h
#ifndef FLIGHT_H
#define FLIGHT_H
#include "clock.h"
#include <string>
using namespace std;
class Flight {
public:
Flight() {};
Flight(string flight_no, int dep_h, int dep_m, int arr_h, int arr_m);
void init(string flight_no,
int dep_h, int dep_m, int arr_h, int arr_m);
void info();
void delay(int min);
private:
string no;
Clock dep, arr;
};
#endif
注意我们定义了两个构造函数。默认构造函数有一个空的函数体。
现在定义一个Flight type的变量:
Flight f1;
此处,定义f1时候,没有给参数,因此默认的构造函数被调用。数据成员no,dep,arr将被用他们类的默认构造函数初始化。数据成员no是个字符串,将被初始化为长度为0的空字符串。其他两个数据成员dep,arr是类Clock的对象,因此类Clock的默认构造函数将被他们两个自动调用。这些数据成员将被自动初始化为0。
如果我们想让一个对象在声明时候得到正确的航班号,离开和达到时间,应该确保第二个构造函数被调用:因此处理如下:
Flight::Flight(string flight_no,int dep_h,int_dep_m,int arr_h,int arr_m) : no(flight_no),dep(Clock(dep_h,dep_m,0)),arr(Clock(arr_h,arr_m,0))
{}
此处我们用初始化列表初始化dep和arr数据成员.两个都调用Clock的构造函数,如果我们声明一个变量:
Flight f2("TP0255“,11,25,13,05);
那么此航班离开和到达时间将被初始化为11:25:00和13:05:00。
带构造函数的完整文件如下:
clock.h
class Clock {
public:
Clock() {};
Clock(int hour, int min, int sec);
void set(int hour, int min, int sec);
int read_hour() { return h; }
int read_min() { return m; }
int read_sec() { return s; }
void write(bool write_sec = true);
void tick();
private:
int h, m, s;
};
flight.h
//The file flight.h
#ifndef FLIGHT_H
#define FLIGHT_H
#include "clock.h"
#include <string>
using namespace std;
class Flight {
public:
Flight() {};
Flight(string flight_no, int dep_h, int dep_m, int arr_h, int arr_m);
void init(string flight_no,
int dep_h, int dep_m, int arr_h, int arr_m);
void info();
void delay(int min);
private:
string no;
Clock dep, arr;
};
#endif
clock.c
#include "clock.h"
#include<iomanip>
#include <iostream>
using namespace std;
void Clock::set(int hour, int min, int sec)
{
h = hour; m = min; s = sec;
}
void Clock::write(bool write_sec)
{
std::cout << setw(2) << setfill('0') << h
<< ':' << setw(2) << setfill('0') << m;
if (write_sec)
std::cout << ':' << setw(2) << setfill('0') << s;
}
void Clock::tick()
{
s = (s + 1) % 60;
if (s == 0)
{
m = (m + 1) % 60;
if (m == 0)
h = (h + 1) % 24;
}
}
Clock::Clock(int hour, int min, int sec) :h(hour), m(min), s(sec) {}
flight.c
//the file flight.cpp
#include "flight.h"
#include <iostream>
#include<iomanip>
#include<string>
using namespace std;
void Flight::init(string flight_no,
int dep_h,int dep_m,int arr_h,int arr_m)
{
no = flight_no;
dep.set(dep_h, dep_m, 0);
arr.set(arr_h, arr_m, 0);
}
void Flight::info()
{
cout << "Flight No: " << no;
cout << ", Dep "; dep.write(false);
cout << ", Arr ", arr.write(false);
cout << endl;
}
void Flight::delay(int min)
{
for (int i = 1; i < min * 60; i++)
dep.tick();
for (int j = 1; j <= min * 60; j++)
arr.tick();
}
Flight::Flight(string flight_no, int dep_h, int dep_m, int arr_h, int arr_m)
: no(flight_no), dep(Clock(dep_h, dep_m, 0)), arr(Clock(arr_h, arr_m, 0))
{ };
main.cpp
//the file main.cpp
#include "flight.h"
void main()
{
Flight f;
f.init("SK1853", 8, 10, 10, 55);
f.delay(15);
f.info();
Flight f2("AirChina", 11, 25, 13, 05);
f2.info();
system("pause");
}