使用类——C++ Prime Plus CH11

本文详细探讨了C++中的运算符重载,解释了如何通过成员函数和非成员函数来实现运算符重载,以及重载的限制。接着介绍了友元的概念,包括友元函数的声明和定义,以及友元在<<重载中的应用。此外,文章还讨论了类的自动转换和强制转换,以及如何在设计类时考虑转换函数和友元的使用。
摘要由CSDN通过智能技术生成

①运算符重载

1.介绍

第八章介绍了函数的重载,是为了让人们通过使用同名的函数完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载则是将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。C++根据操作数的数目和类型决定采用哪种操作。

C++允许将运算符重载扩展到用户定义的类型,重载运算符可以使得代码看起来更自然。要使用重载运算符,需使用运算符函数的形式:

operatorop(参数); op必须是有效的C++运算符,不能虚构一个新的符号。例如,假设有一个Salesperson类,并为它定义了一个operator+()成员函数,以重载+运算符,如果district2,sid和sara都是Salesperson类对象,便可以编写这样的等式:

district2=sara+sid;

在编译器眼里,上述语句将被转换为对象函数的调用:

district2=sara.operator+(sid);

最重要的是,我们可以使用简便的+运算符表示法,而不必使用笨拙的函数表示法

2.示例

假设我们要将两个时间加起来。

1.通过类成员函数来处理:

//move.h文件
#ifndef MOVE_H
#define MOVE_H

class Time
{
private:
	int hours;
	int minutes;
public:
	Time();
	Time(int h, int m);
	void ShowTime() const;
	void AddMin(int min);
	void AddHour(int h);
	Time Sum(const Time &t) const;    //函数成员

};

#endif
//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"


Time::Time()
{
	hours = minutes = 0;
}
Time::Time(int h, int m)
{
	hours = h;
	minutes = m;
}
void Time::ShowTime() const
{
	std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
	minutes += min;
	hours += minutes / 60;
	minutes = minutes % 60;
	}
void Time::AddHour(int h)
{
	hours += h;
	}
Time Time::Sum(const Time& t) const
{
	Time temp;
	temp.minutes = minutes + t.minutes;
	temp.hours = hours + t.hours + temp.minutes / 60;
	temp.minutes = temp.minutes % 60;
	return temp;
	}
//usemove.cpp
#include<iostream>
#include"Move.h"

int main()
{
	using namespace std;
	Time Planning;
	Time coding(2,40);
	Time fixing = Time(5, 55);
	Planning.ShowTime();
	coding.ShowTime();
	fixing.ShowTime();
	Planning = coding.Sum(fixing);
	Planning.ShowTime();

}

注意:代码参数是引用,但返回类型不是引用。将参数声明为引用时为了提高效率,然而返回值不是引用这是因为我们创建了对象的副本,使得调用函数可以调用它,如果返回也是引用的话,由于temp是局部变量,在函数结束时会被自动清除,因此引用将指向一个不存在的对象,错误!

2.添加加法运算符:

只需要将Sum()名称改为operator+()即可。

//move.h文件
#ifndef MOVE_H
#define MOVE_H

class Time
{
private:
	int hours;
	int minutes;
public:
	Time();
	Time(int h, int m);
	void ShowTime() const;
	void AddMin(int min);
	void AddHour(int h);
	Time operator+(const Time &t) const;    //变化在这里

};

#endif

 

//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"


Time::Time()
{
	hours = minutes = 0;
}
Time::Time(int h, int m)
{
	hours = h;
	minutes = m;
}
void Time::ShowTime() const
{
	std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
	minutes += min;
	hours += minutes / 60;
	minutes = minutes % 60;
	}
void Time::AddHour(int h)
{
	hours += h;
	}
Time Time::operator+(const Time& t) const
{
	Time temp;
	temp.minutes = minutes + t.minutes;
	temp.hours = hours + t.hours + temp.minutes / 60;
	temp.minutes = temp.minutes % 60;
	return temp;
	}
//usemove.cpp
#include<iostream>
#include"Move.h"

int main()
{
	using namespace std;
	Time Planning;
	Time coding(2,40);
	Time fixing = Time(5, 55);
	Planning.ShowTime();
	coding.ShowTime();
	fixing.ShowTime();
	Planning = coding + fixing;    //变化在这里
	Planning.ShowTime();

}

 问:可以将两个以上的对象相加吗?

我们要看语句如何被转为函数调用,发现是可以多个变量相加。

3.其他重载运算符:

定义了减法  和一个整数相乘:

//move.h文件
#ifndef MOVE_H
#define MOVE_H

class Time
{
private:
	int hours;
	int minutes;
public:
	Time();
	Time(int h, int m);
	void ShowTime() const;
	void AddMin(int min);
	void AddHour(int h);
	Time operator+(const Time &t) const;    //变化在这里
	Time operator-(const Time& t) const;
	Time operator*(int n) ;

};

#endif
//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"


Time::Time()
{
	hours = minutes = 0;
}
Time::Time(int h, int m)
{
	hours = h;
	minutes = m;
}
void Time::ShowTime() const
{
	std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
	minutes += min;
	hours += minutes / 60;
	minutes = minutes % 60;
	}
void Time::Add
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值