友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载

先定义一个测试类Complex,其中用成员函数的方法重载了+、-、前置++、前置--、后置++、后置--这6个运算符,当然,这6个操作符也可以用友元函数方式重载,但习惯上这些都直接用成员函数方式重载。

demo

#include <iostream>
using namespace std;

class Complex
{
public:
	Complex(int a = 0, int b = 0)
	{
		this->a = a;
		this->b = b;
	}
	~Complex();

	//打印复数
	void printCom()
	{
		cout << a << " + " << b << "i" << endl;
	}

	// 实现 + 运算符重载
	Complex operator+(Complex &c2)
	{
		Complex tmp(this->a + c2.a, this->b + c2.b);
		return tmp;
	}

	// 实现 - 运算符重载
	Complex operator-(Complex &c2)
	{
		Complex tmp(this->a - c2.a, this->b - c2.b);
		return tmp;
	}

	// 实现 前置++ 运算符重载
	Complex& operator++()
	{
		a++;
		b++;
		return *this;
	}

	// 实现 后置++ 运算符重载
	// 这里涉及到了占位参数的使用,因为不过不用占位参数
	// 后置++的重载函数和前置++的参数就相同了,这样重载就出现了语法错误
	Complex& operator++(int)
	{
		Complex tmp = *this;
		this->a++;
		this->b++;
		return tmp;
	}

	// 实现 前置-- 运算符重载
	Complex& operator--()
	{
		a--;
		b--;
		return *this;
	}

	// 实现 后置-- 运算符重载
	Complex& operator--(int)
	{
		Complex tmp = *this;
		this->a--;
		this->b--;
		return tmp;
	}

private:
	int a;
	int b;
};

int main()
{

	return 0;
}

注意同时实现前置++和后置++时,成员函数重载时会出现参数相同而无法实现函数重载的情况,只需要给其中一个加上一个占位参数,就可以了。

1)友元函数和成员函数选择方法

当无法修改左操作数的类时,使用全局函数进行重载

=, [], ()和->操作符只能通过成员函数进行重载

2)用友元函数重载 << >>操作符

istream 和 ostream 是 C++ 的预定义流类

cin 是 istream 的对象,cout 是 ostream 的对象

运算符 << 由ostream 重载为插入操作,用于输出基本类型数据

运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据

用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型

给第一个demo中的Complex类重载左移和右移操作符。

demo

<pre name="code" class="cpp">// 友元函数方法实现 << 操作符重载
ostream& operator<<(ostream& out, Complex &c1)
{
<span style="white-space:pre">	</span>out << c1.a << "+" << c1.b << "i" << endl;
<span style="white-space:pre">	</span>return out;
}

// 友元函数方法实现 >> 操作符重载
istream& operator>>(istream& in, Complex &c1)
{
<span style="white-space:pre">	</span>in >> c1.a >> c1.b;
<span style="white-space:pre">	</span>return in;
}

记得要在类Complex中加上

friend ostream& operator<<(ostream& out, Complex &c1);
friend istream& operator>>(istream& in, Complex &c1);

这里就只能用友元函数做操作符重载了,因为如果用成员函数,必须要在操作符左边的数据类型的声明中加入代码,但是cout或者cin能获取到吗,就算获取到,这种做法也是及其不可取的,因为最好不要对自带库文件进行修改。所以这里最好的方式就是用友元函数。

3) 友元函数重载操作符使用注意点

a)友员函数重载运算符常用于运算符的左右操作数类型不同的情况。

b)其他

在第一个参数需要隐式转换的情形下,使用友员函数重载运算符是正确的选择。

友员函数没有 this 指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换。

C++中不能用友员函数重载的运算符有:

=   ()    []   ->

时间: 2024-10-14 14:02:25

友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载的相关文章

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

操作符(++,+,+=,小于号,(),--等)重载

 1. 操作符(++,+,+=,小于号等)重载 新建QT项目,编写头文件 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include<QLabel> namespace Ui { class Dialog; } //编写自己的Label class myLabel { public: //一定要是共有的,才可以被调用 QLabel *ql; int cx; int cy; myLabel() { ql=new QL

C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符

重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成员,以便编译器能够知道是否须要合成一个.并且还能够为一个类定义很多附加的赋值操作符,这些赋值操作符会由于右操作数的不同而构成重载!如string类型: string car("Volks"); car = "Studebaker"

函数重载(续)==》函数重载和函数指针在一起

函数重载与函数指针(这一块很重要,后续要继续学习): 当使用重载函数名对函数指针赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 #include <iostream> using namespace std; void myFunc(int a) {     printf("a:%d\n",a); } void myFunc(char *p) {     printf("p:%s\n",p); } v

C++中的重载,隐藏,虚函数,多态浅析

直到今日,才发现自己对重载的认识长时间以来都是错误的.幸亏现在得以纠正,真的是恐怖万分,雷人至极.一直以来,我认为重载可以发生在基类和派生类之间,例如: 1 class A { 2 public: 3 void test(int); 4 }; 5 class B : public A { 6 public: 7 void test(int, int); 8 }; 9 10 void main() 11 { 12 B b; 13 14 b.test(5);  //错误,应该b.A::test(5)

Numpy中Meshgrid函数介绍及2种应用场景

近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法.但总觉得印象不深刻,不是太了解meshgrid的应用场景.所以,本文将进一步介绍Numpy中meshgrid的用法. Meshgrid函数的基本用法 在Numpy的官方文章里,meshgrid函数的英文描述也显得文绉绉的,理解起来有些难度.可以这么理解,meshgrid函数用两个坐标轴上的点在平面上画网格.用法: [X,Y]=meshgrid(x,y) [X,Y]=meshgrid(x)与[X,Y]=meshg

无服务架构在IOT的应用场景——使用函数工作流处理DIS数据

在物联网领域,复杂性往往并非在于传感器,真正的复杂性在于各种传感器产生的大量数据,以及对这些数据的处理,所以开发者不得不花费大量的时间去构建和维护后端服务器来处理这样一个庞大的数据流.而在今天这个敏捷.快速迭代,对业务创新周期要求越来越短的时代,这无疑是难以接受的.本文我们将通过一个简单的物联网场景,基于函数工作流(FunctionGraph,FGS)来介绍一下无服务(Serverless)在物联网领域的应用. 函数工作流是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩.免运维

c++-内联函数和函数重载和默认参数和函数指针

内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义.如果已定义的函数多于一行,编译器会忽略 inline 限定符. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说