C++运算符重载(友元函数方式)

原创 2015年07月10日 11:27:53

我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数。

当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。

重载为友元函数的运算符重载函数的定义格式如下:

friend 函数类型 operator 运算符(形参表) 
{ 
	函数体; 
} 

一、程序实例

//运算符重载:友元函数方式
#include <iostream.h>

class complex //复数类
{
public:
	complex(){ real = imag = 0;}
	complex(double r, double i)
	{
		real = r;
		imag = i;
	}
	friend complex operator + (const complex &c1, const complex &c2); //相比于成员函数方式,友元函数前面加friend,形参多一个,去掉类域
	friend complex operator - (const complex &c1, const complex &c2); //成员函数方式有隐含参数,友元函数方式无隐含参数
	friend complex operator * (const complex &c1, const complex &c2);
	friend complex operator / (const complex &c1, const complex &c2);

	friend void print(const complex &c); //友元函数

private:
	double real; //实部
	double imag; //虚部

};

complex operator + (const complex &c1, const complex &c2) 
{
	return complex(c1.real + c2.real, c1.imag + c2.imag);
}

complex operator - (const complex &c1, const complex &c2)
{
	return complex(c1.real - c2.real, c1.imag - c2.imag);
}

complex operator * (const complex &c1, const complex &c2)
{
	return complex(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.real + c1.imag * c2.imag);
}

complex operator / (const complex &c1, const complex &c2)
{
	return complex( (c1.real * c2.real + c1.imag * c2. imag) / (c2.real * c2.real + c2.imag * c2.imag), 
		(c1.imag * c2.real - c1.real * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag) );
}

void print(const complex &c) 
{
	if(c.imag < 0)
		cout<<c.real<<c.imag<<'i'<<endl;
	else
		cout<<c.real<<'+'<<c.imag<<'i'<<endl;
}

int main()
{	
	complex c1(2.0, 3.5), c2(6.7, 9.8), c3;
	c3 = c1 + c2;
	cout<<"c1 + c2 = ";
	print(c3); //友元函数不是成员函数,只能采用普通函数调用方式,不能通过类的对象调用

	c3 = c1 - c2;
	cout<<"c1 - c2 = ";
	print(c3);

	c3 = c1 * c2;
	cout<<"c1 * c2 = ";
	print(c3);

	c3 = c1 / c2;
	cout<<"c1 / c2 = ";
	print(c3);
	return 0;
}

二、程序运行结果


从运行结果上我们就可以看出来,无论是通过成员函数方式还是采用友元函数方式,其实现的功能都是一样的,都是重载运算符,扩充其功能,使之能够应用于用户定义类型的计算中。

三、两种重载方式(成员函数方式与友元函数方式)的比较

一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。因为,它如果被重载为友元函数,将会出现与赋值语义不一致的地方。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C++重载运算符及<<输出运算符为什么要声明为友元函数

先看下操作重载的定义和要求: 要进行操作符重载首先要求是自定义类型的运算 写法格式:返回值 operator运算符(参数列表){} 重载的要求: 1、内置类型的操作符不能被重载 2...

C++ 运算符流操作符重载和友元--笔记

/************************************************************************************************ *...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

运算符重载函数作为类成员函数与友元函数的区别

运算符重载函数作为类成员函数与友元函数

运算符重载函数作为类成员函数和友元函数

可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real...

【c++】关于类继承运算符重载友元函数

/*以下代码在vc++6.0中通不过 并不意味代码有误,请更换编译 器运行---枯等街寒又何妨2014/01/05*/ #include #include using namespace std; c...

C++抽象编程——面向对象(4)——运算符重载与友元函数

运算符重载(Operator overloading)从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型。这种技术称为运算符重载。 例如,字符串类重载* + *运算符...

C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)

*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Wo...
  • vcx08
  • vcx08
  • 2016-05-14 22:26
  • 366

c++友元函数及运算符重载

前言: c++的类和java的类机制着实不大一样,不仅仅是语法,还包括一些特殊的东西,如c++用友元函数来破坏类的封装性,使得外界(友元函数体)可以访问类的私有属性,而java呢,java则可以通过反...
  • ydxlt
  • ydxlt
  • 2016-04-10 21:39
  • 874

C++Primer Plus 第十一章-运算符重载和友元函数

C++Primer Plus 第十一章-运算符重载和友元函数
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)