下面我们通过一个例子
来看看如何在程序中
定义和使用构造函数
现在我们把前面这个例题
做一点修改
在它的成员函数里面
增加了这样一个特殊的函数
叫做构造函数
大家看
这个函数的函数名
跟类名是完全一样的
包括大小写都要一样
而且这个函数
没有返回值类型
也不能写成void类型
就是不能定义返回类型
这样的构造函数
它的参数表中是可以有参数的
根据需要写多少个参数都可以
好 从这个例题里面来看呢
增加了这样一个
构造函数的原型声明
我们再看函数的实现
这是构造函数的实现
同样实现构造函数的时候
也需要把类名写在前面
因为这个不是全局函数
是类的成员函数
它实现的时候都要写类名
在它实现的时候呢
也是不能规定返回类型
而且我们看这个函数体里面
是没有return语句的
不能写return语句
接下来我们看
在这个参数表之后有一个冒号
在冒号之后
左大括号之前
这个序列
这是干什么的呢
这叫初始化列表
也就是说
如果我们要对类的成员变量
进行初始化的话
首选用这种方式
如果你是做简单初始化
比如说像我们这个初始化
就很简单
就是将形参值
对应着赋值给这个类的对象的
数据成员
newH复制给hour
newM复制给minutenewS复制给second
就这么对应赋值
那么我们就不必要在函数体中
去写这样的简单赋值了
就将这种初始化的关系
写到初始化列表里面
它是表示用newH
去初始化hour这个变量
去nemM去初始化
minute变量second也是这样的
用初始化列表的方式
比起你在函数体中
去写赋值表达式的效率要高一些
接下来呢
我们来看主函数中
这回由于有了构造函数
我们定义Clock类的对象
C的时候
就可以给它初始值了
大家看
我们给了三个0
这样在构造对象的时候
就会自动去调用
这个Clock类的构造函数
并且把这三个初始化的参数
传给Clock函数
传给这个构造函数作为实参
那么这些传过来的数值呢
又通过初始化列表的指定
用来初始化了
小时 分秒这三个成员变量
这就是构造函数
在初始化过程中的作用
好 现在呢
我们在这个编译环境中
用单步跟踪的方式
来观察一下构造函数的执行
首先我们进入到主函数中
在这儿按f10
就以调试状态进入主函数了
执行到这个地方呢
我们看
那这个构造
预期它应该进入到
构造函数中去的
所以在这儿我们就按f11
如果你按f10
它一下就跳过了
按f11大家看
进到构造函数中了
我们执行进到构造函数
函数体中去
虽然这个函数体是空的
我们进到函数体中去
那就说明在进入函数体之前
这个初始化列表
指定的初始化任务
应该都是已经完成了的
那我们来看看完成的效果
这个时候我们看this
指的就是当前对象
你正在构造的这个对象
看看这个对象里面的小时
分秒 它都已经是0了
都已经初始化完成好了
我们再回来到主函数中
我们看主函数中这个对象c
它已经构造好了
小时分秒都有了
接下来再执行一步
就会把这个显示到显示器上去
0：0：0
我们看到在这儿
这就是构造函数
它的执行的时机
我们从这个例子就看到了