以前在我们进行定义一个变量的时候,会手动进行输出初始化。在基于对象的程序中,定义一个对象时候,需要做初始化的工作,也就是对数据成员赋初值,那么该如何做呢?
class Time
{
public:
hour = 0;
minute = 0;
second =0 ;
}
我们通常会这样想,但这是一种错误的写法,因为这定义的是一个类,并不是一个实体,而是一种抽象类型,并不占存储空间,显然无法容纳数据。
假若一个类中的数据成员都是公有的,我们可以这样初始化,Time t1 = (12,32,24);但假如数据成员是私有的,或者类中有有private和protected的数据成员,就不能用这种方法进行初始化。为了解决这个问题,c++中提供了构造函数来处理对象的初始化,它是一种特殊的成员函数,与其他的成员函数的不同,不需要用户调用,而是在建立对象时候自动执行。
构造函数的特点:名字与类名同名,而不能任意命名,没有任何类型,不返回任何值。
#include<iostream>
using namespace std;
class Time
{
public:
Time()
{
hour = 0;
minute = 0;
second = 0;
}
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
}
void Time::set_time()
{
cin >> hour >> endl;
cin >> minute >> endl;
cin >> second >> endl;
}
void Time:show_time()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
int main()
{
Time t1;
t1.set_time();
t1.show_time();
Time t2,
t2.show_time();
return 0;
}
此时我们直接在构造函数中对数据成员进行初始化,输出的结果:前者t1的结果是自己主动输入的结果,后者没有输入,默认是是初始化的结果,也就是t2输出的结果。此时是默认不带参数的构造函数。
在执行主函数时候,首先建立对象t1,此时自动执行构造函数Time,在执行构造函数Time过程中对t1对象中的数据成员赋初值0,然后执行主函数中的t1.set_time()函数,从键盘输入新值赋给对象t1的数据成员,再输出t1的数据成员的值。接着建立对象t2,同时自动执行构造函数Time,对t2中的数据成员赋初值0,但主函数中没有对t2的数据成员赋新值,直接输出数据成员的初值。
构造函数使用说明:
- 在建立,定义类对象的时候,自动调用构造函数,而且只能调用一次(在建立每个类对象时候都只能调用一次)
- 构造函数没有返回值,它的作用只是对对象进行初始化。
- 构造函数不需要用户调用,也不能被用户调用
- 构造函数的函数体不仅可以对数据成员赋初值,还可以对包含其他语句。
- 可以用一个类对象来初始化另一个类对象,如:Time t1; Time t2 = t1;
- 如果用户没有定义构造函数,则c++系统会自动生成一个构造函数,只是该函数是空的,没有参数,不执行初始化操作。