一、问题引入:数据成员初始化
- 对数据成员进行初始化
方法1:
Class Time
{ public:
Hour;
Minute;
Sec;
};
Time T1={14,56,30};
这种初始化方法仅用于对象的成员均为public的情况。如果数据成员是私有的,或者类中有private或protected的数据成员就不能用这种方法进行初始化
方法2:
用成员函数对对象中的数据成员赋初值。
二、构造函数概述
- 构造函数的定义
- 不需要用户来调用他;,而是在建立对象时自动执行。
- 构造函数的名字必须与类名同名,而不能任意命名,以便于编译系统能识别他,并把他当构造函数处理。
- 他具有任何类型,不具有返回值。
- 既可以在类内定义构造函数,也可以先在类内声明,后在类外定义函数。
- 如果用户没有自己定义构造函数,c++系统会自动生成一个构造函数,只是这个构造函数函数体是空的,也没有参数,不执行初始化操作;
(参照代码1 构造函数的使用)
第三行便是系统自动给的初值。
- 什么时候调用构造函数
- 在建立类对象时,会自动调用构造函数,在建立对象时系统会该对象分配存储单元。此时执行构造函数,就把指定的初值送到有关数据成员的存储单元中。
- 每建立一个对象,就调用一次构造函数。
- 构造函数是在定义对象时由系统自动执行的,而且只能执行一次。
- 构造函数不能被用户调用。 如:t1.time()是错误的。
- 构造函数没有返回值,他的作用只是对对象进行初始化。因此也不需要在定义构造函数时声明类型。
Int time()
或void time()是不对的。
直接time()
- 可以用一个类对象初始化另一个类对象。
Time t1;
Time t2=t1; //建立对象t2,并用一个t1来初始化t2;
此时相当于把t1的数据成员的值拷贝到t2相应各成员。
- 在构造函数的函数体中除了定义初值,还可以写其他语句。但为了程序清晰,一般不建议写其他内容。
- 带参数的构造函数
- 带参数的构造函数中的形参,其对应的实参是在建立对象时给定的,即在建立对象时间同时指定数据成员的初值。
- 用这种方法可以方便地实现对不同对象进行不同的初始化。给不同的对象赋不同的初值。
- 优点:很直观,很方便,在定义语句直接看到数据成员的初值。
- 格式:
构造函数名(类型1 形参1,类型2 形参2,…)
如: box(int h,int w,int l);
类名 对象名(实参1,实参2,…);
如:box box1(10,20,30)
参照代码2;
- 用参数初始化表对数据成员初始化
- 格式:在函数首部的末尾加一个冒号,然后列出参数的初始化表。
如:
Box::Box(int h,int w,int len):height(h),width(w),length(len){ }
用形参h的值初始化数据成员height,用形参w的值初始化数据成员