CPP-Calling constructors(调用构造函数)

构造函数的调用:
构造函数和普通函数调用有所区别,看以下生成类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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值