标签:类成员 初始 必须 lan ISE 多个 出现 构造 变量
在类中,有一种特殊的成员函数,它的名字和类名相同,我们在创建类的对象的时候,这个特殊的成员函数就会被系统自动调用,这个成员函数,就叫“构造函数”。因为构造函数会被系统自动调用,所以我们可以简单的理解成 构造函数的目的就是初始化类对象的数据成员;
构造函数
一个类中可以有多个构造函数,更多函数,可以为类对象创建提供多个初始化方法,但是多个构造函数之间总要有点不同的地方,比如,参数数量或参数类型;
2). 在具有多个参数的构造函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,他右边的所有参数必须指定默认值;
定义一个对象的时候,当初始化值和对象类型不匹配时候,会存在临时对象和隐式类型转换的问题,编译器内部会进行隐式类型转换;这种写法比较模糊,不能明确编译器到底调用哪个构造函数;
因此可以通过声明构造函数的时候,加上explicit关键字,进制隐式类型转化,该函数只能用于初始化和显示类型转换;
建议
//头文件
#ifndef __MYTIME__
#define __MYTIME__
class Time
{
private:
int MilliSecond; //毫秒
private:
void initMilliSecond(int mls);
public:
int Hour; //小时
int Minue; //分钟
int Second; //秒钟
public:
//构造函数
explicit Time(int tmphour, int tmpmin, int tmpsec);
Time(int tmphour, int tmpmin); //有冲突 与上面的函数
explicit Time(int tmphour);
Time();
//...
private:
//...
};
#endif
//源文件
#include "time.h"
void Time::initMilliSecond(int mls)
{
MilliSecond = mls;
}
Time::Time(int tmphour, int tmpmin, int tmpsec)
//Hour(tmphour), Minue(tmpmin), Second(tmpsec), MilliSecond(0) //构造函数初始化列表
:Hour(tmphour), Minue(Hour) //不要用成员函数去进行初始化,构造函数中先有值还是Minue先有值取决于time.h头文件中定义的顺序
{
// Hour = tmphour; // 成员函数中,可以直接使用成员变量名
// // 哪个对象调用的该成员函数,这些成员变量就属于哪个对象,可以理解成类成员函数知道哪个对象调用自己
// Minue = tmpmin;
// Second = tmpsec;
// initMilliSecond(0);
std::cout<<"调用了构造函数"<<std::endl;
}
Time::Time()
{
Hour = 12;
Second = 13;
initMilliSecond(0);
std::cout<<"调用了无参构造函数"<<std::endl;
}
Time::Time(int tmphour, int tmpmin)
{
Hour = 12;
Second = 59;
}
Time::Time(int tmphour)
{
Hour = tmphour;
}
Time::Time(int tmphour, int tmpmin, int tmpsec)
//Hour(tmphour), Minue(tmpmin), Second(tmpsec), MilliSecond(0) //构造函数初始化列表
:Hour(tmphour), Minue(Hour) //不要用成员函数去进行初始化,构造函数中先有值还是Minue先有值取决于time.h头文件中定义的顺序
{
// Hour = tmphour; // 成员函数中,可以直接使用成员变量名
// // 哪个对象调用的该成员函数,这些成员变量就属于哪个对象,可以理解成类成员函数知道哪个对象调用自己
// Minue = tmpmin;
// Second = tmpsec;
// initMilliSecond(0);
std::cout<<"调用了构造函数"<<std::endl;
}
标签:类成员 初始 必须 lan ISE 多个 出现 构造 变量
原文地址:https://www.cnblogs.com/Trevo/p/13324447.html