C++ primer plus 第11章 使用类

1.添加加法运算符

operator+()函数的名称使得可以使用函数表示法或运算符表示法来调用它。

total=coding.operator+(fixing);//函数表示法
total=coding+fixing;//运算符表示法

多数C++运算符都可以用这样的方式重载。重载的运算符不必是成员函数,但必须至少有一个操作数是用户定义的类型。

重载运算符的限制:(1)重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。因此,不能将减法运算符(-)重载为计算两个double值的和,而不是它们的差。(2)使用运算符时不能违反运算符原来的句法规则。不能修改运算符的优先级(3)不能创建新运算符(4)不能重载部分运算符(见书387面)。

2.友元

C++控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径,但有时候这种限制太严格,以至于不适合特定的编程问题。在这种情况下,C++提供了另外一种形式的访问权限:友元——友元函数、友元类和友元成员函数。

通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。在为类重载二元运算符时(带两个参数的运算符)常常需要友元。

A=B*2.75;//可以被装换成下面的成员函数调用:
A=B.operator*(2.75);
A=2.75*B;//这个语句又将如何转换?
A=operator*(2.75,B)//A=2.75*B;可以与此非成员函数调用匹配

对于非成员函数重载运算符函数来说,运算符表达式左边的操作数对应于运算符函数的第一个参数,运算符表达式右边的操作数对应于运算符函数的第二个参数。非成员函数不能直接访问类的私有数据,至少常规非成员函数不能访问。然而,有一种特殊的非成员函数可以访问类的私有成员——友元函数。

创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend:

friend Time operator*(double m,const Time &t);

虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;虽然operator*()函数不是成员函数,但是它与成员函数的访问权限相同。

第二步是编写函数定义。因为它不是成员函数,所以不要使用Time::限定符。另外不要在定义中使用关键字friend。

常用的友元:重载<<运算符

void operator<<(ostream & os,const Time &t)
{
    os<<t.hours<<"hours,"<<t.minutes<<"minutes";
}
//这样就可以使用,trip是Time的一个对象
//cout<<trip
//mytime.h
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include<iostream>
class Time
{
private:
	int hours;
	int minutes;

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+(const Time &t)const;
	Time operator-(const Time &t) const;
	Time operator*(double n) const;
	friend Time operator*(double m,const Time &t)
	{return t*m;}
	friend std::ostream & operator<<(std::ostream &os,const Time &t);
};

#endif

//mytime.cpp
#include "mytime.h"
Time::Time()
{
	hours=minutes=0;
}
Time::Time(int h,int m)
{
	hours=h;
	minutes=m;
}
void Time::AddMin(int m)
{
	minutes+=m;
	hours+=minutes/60;
	minutes%=60;
}
void Time::AddHr(int h)
{
	hours+=h;
}
void Time::Reset(int h,int m)
{
	hours=h;
	minutes=m;
}
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;
}
Time Time::operator-(const Time &t)const
{
	Time diff;
	int tot1,tot2;
	tot1=t.minutes+60*t.hours;
	tot2=minutes+60*hours;
	diff.minutes=(tot2-tot1)%60;
	diff.hours=(tot2-tot1)/60;
	return diff;

}
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;
}
std::ostream & operator<<(std::ostream &os,const Time &t)
{
	os<<t.hours<<"hours,"<<t.minutes<<"minutes";
	return os;
}


//usingtime.cpp

#include<iostream>
#include"mytime.h"
int main()
{
	using std::cout;
	using std::endl;
	Time aida(3,35);
	Time tosca(2,48);
	Time temp;
	cout<<"Aida and Tosca:\n";
	cout<<aida<<":"<<tosca<<endl;
	temp=aida+tosca;
	cout<<"Aida+Tosca:"<<temp<<endl;
	temp=aida*1.17;
	cout<<"Aida*1.17:"<<temp<<endl;
	cout<<"10.0*Tosca:"<<10.0*tosca<<endl;
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/CHY1156957638/article/details/85950798