今天是秋分,在
这一天里太阳直射赤道,形成昼夜等长,一天24小时昼夜均分为12小时,自秋分其往后天气渐凉。
我在工作中会遇到对定额工时的处理,包括工时的加减乘倍等处理,其正则表达式表示为"^/d+:[0-5]/d$",如"0:00", "16:59", "2:40"等。下面就以此为例解说类的构造函数,复制构造函数,赋值运算符,析构函数。在这个类中包含两个私有成员数据m_ration和m_minutes,前者用于表示工时的字符串而后者则是工时换算成的分钟数。
一. 构造函数(constructor)
构造函数与其它函数有以下两点不同:1.构造函数的名称必须与类的名相同。2.构造函数不能有返回值。另外构造函数可以重载。
二. 复制构造函数(copy constructor)
复制构造函数也是与类的名称相同的成员函数,它的作用是用来复制一个已经存在的同类型对象,并用它来初始化一个新的对象,因此 复制构造函数只有一个参数,该参数通常是一个常量引用类型。在实际使用中 复制构造函数分为显示复制和隐式复制两种,用一个对象初始化另一个对象称为显示复制,而把一个对象的值作为参数传递给函数,或从函数中通过传值返回一个对象称为隐式复制。
三. 赋值运算符
赋值运算符必须是一个类的成员函数,必须有一个返回值。 每个类都可以定义几种不同的赋值运算符(operator=),但其中以一个指向类自身的常量引用比较特别, 它定义了把一个类对象赋给另一个类对象时的操作, 如果你没有定义那编译器会自动为你生成一个。
复制构造函数与 赋值运算符的区别:赋值总是把一个已经存在的值(运算符左侧的对象)清除,然后以一个新的值( 运算符右侧的对象 )取代。而在进行复制时先创建一个新的对象,所以不需要对一个已经存在的对象进行清除操作。
四. 析构函数(destructor)
析构函数没有任何参数,没有返回值。作用是在一个对象删除时被自动调用用以释放对象所占用的资源。
我在工作中会遇到对定额工时的处理,包括工时的加减乘倍等处理,其正则表达式表示为"^/d+:[0-5]/d$",如"0:00", "16:59", "2:40"等。下面就以此为例解说类的构造函数,复制构造函数,赋值运算符,析构函数。在这个类中包含两个私有成员数据m_ration和m_minutes,前者用于表示工时的字符串而后者则是工时换算成的分钟数。
一. 构造函数(constructor)
构造函数与其它函数有以下两点不同:1.构造函数的名称必须与类的名相同。2.构造函数不能有返回值。另外构造函数可以重载。
CRation(void); // 默认构造函数
CRation(std::string); // 用string做参数
CRation(const char*); // 用常量字符串做参数
CRation(int); // 用int型的分钟数做参数
CRation::CRation() : m_minute(0), m_ration("0:00")
{
}
CRation::CRation(string ration)
{
create(ration);
}
CRation::CRation(const char *ration)
{
if(!ration)
{
m_minute = 0;
m_ration = "0:00";
}
else
create(ration);
}
CRation::CRation(int minutes)
{
m_minute = minutes;
get_Ration();
}
CRation ra1;
CRation ra2("2:40");
string str;
CRation ra3(str);
CRation ra4(100);
二. 复制构造函数(copy constructor)
复制构造函数也是与类的名称相同的成员函数,它的作用是用来复制一个已经存在的同类型对象,并用它来初始化一个新的对象,因此 复制构造函数只有一个参数,该参数通常是一个常量引用类型。在实际使用中 复制构造函数分为显示复制和隐式复制两种,用一个对象初始化另一个对象称为显示复制,而把一个对象的值作为参数传递给函数,或从函数中通过传值返回一个对象称为隐式复制。
CRation(const CRation&);
CRation::CRation(const CRation &rhs)
{
m_minute = rhs.get_Minute();
m_ration = rhs.getRation();
}
CRation ra1;
CRation ra2 = ra1; // 显示复制
三. 赋值运算符
赋值运算符必须是一个类的成员函数,必须有一个返回值。 每个类都可以定义几种不同的赋值运算符(operator=),但其中以一个指向类自身的常量引用比较特别, 它定义了把一个类对象赋给另一个类对象时的操作, 如果你没有定义那编译器会自动为你生成一个。
CRation& operator=(const CRation&); // 默认类型的 赋值运算符
CRation& operator=(const char*); // 其它类型的赋值运算符
CRation& CRation::operator =(const CRation &rhs)
{
if(this == &rhs)
return *this;
m_minute = rhs.get_Minute();
m_ration = rhs.getRation();
return *this;
}
CRation& CRation::operator =(const char *rhs)
{
create(rhs);
return *this;
}
CRation ra1("4:20");
CRation ra2 = "8:40";
ra2 = ra1; // ra2等于"4:20" 调用 CRation& operator=(const CRation&);
ra2 = "0:00"; // ra2等于"0:00" 直接调用 CRation& operator=(const char*);
复制构造函数与 赋值运算符的区别:赋值总是把一个已经存在的值(运算符左侧的对象)清除,然后以一个新的值( 运算符右侧的对象 )取代。而在进行复制时先创建一个新的对象,所以不需要对一个已经存在的对象进行清除操作。
四. 析构函数(destructor)
析构函数没有任何参数,没有返回值。作用是在一个对象删除时被自动调用用以释放对象所占用的资源。
~CRation(void);复制构造函数,赋值运算符,析构函数三者间关系密切,如果一个类需要析构函数,那么它可能同时也需要一个复制构造函数和一个赋值运算符。