本篇主要讲三个内容:运算符重载、友元、类的自动转换与强制转换
运算符重载
首先明白,运算符重载 是一个使对象操作更美观的一个技巧,实现的效果如下:
//头文件 mytime1.h
...
class Time
{
private:
int hours;
int minites;
public:
Time();
Time(int h, int m = 0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h = 0, int m = 0);
Time operator*(double n) const; //operator 关键字加上需要重载的 * 号
Time operator+(const Time & t) const; //operator 关键字加上需要重载的 + 号
//Time Sum(const Time & t) const; //这是原来不用运算符重载时的函数声明
void Show() const;
}
//成员函数定义文件 mytime1.cpp
#include "mytime1.h"
...
Time Time::operator*(double mult) const //定义该重载函数
{
Time result;
long totalminutes = hours * mult * 60 + minutes * mult;
result.hours = totalminutes / 60;
result.minutes = totalminutes % 60;
return result;
}
Time Time::operator+(const Time & t) const //定义该重载函数
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
#include "mytime1.h"
Time coding(2, 40);
Time fixing(5, 55);
Time adjusted;
adjusted = coding * 1.5; //注意这个顺序,一定是 coding 在前面,1.5 在后面
total = coding + fixing; //这里就是 运算符重载 发挥了作用,让对象操作如此美观!!
有很多运算符都可以用来重载,具体哪些可以查阅资料,在这里不作一一叙述。
adjusted = coding * 1.5;
//这一句中,因为乘法运算符是重载在coding的成员函数中的,所以必须是coding在前面
//那现在想用这样:adjusted = 1.5 * coding;
//于是引出 友元函数
友元函数
友元有三种:友元函数、友元类、友元成员函数
本章只介绍友元函数
让函数称为类的友元可以赋予该函数与类的成员函数相同的访问权限
//在类声明中声明
friend Time operator*(double m, const Time & t) const; //注意关键字“friend”的运用
//注意两点:
//operator*()是在类声明中声明的,但他不是成员函数,因此不能使用成员运算符来调用,也就是说不能直接hours=1,只能t.hours=1,因为俺不是成员函数
//operator*()拥有与成员函数的访问权限相同
//定义
Time operator*(double m, const Time & t) const
{
Time result;
long totalminutes = t.hours * mult * 60 + t.minutes * mult;
result.hours = totalminutes / 60;
result.minutes = totalminutes % 60;
return result;
}
//主程序中调用
Time coding(2, 40);
Time adjusted;
adjusted =1.5 * coding ;
类的自动转换与强制转换
当我这个类的构造函数只有一个参数时
class Time
{
...
public:
Time(int hours);
// explicit Time(int hours); //加上关键字“explicit”可以关闭这种自动特性,也就是说t1 = 22;不合法
...
}
//当主函数出现:
Time t1;
t1 = 22; //这里这个会自动进行类型转换,总之这样是合法的,但只适用于构造函数只有一个输入
时间问题,结篇