关闭

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

标签: C++运算符重载operator友元函数friend
1572人阅读 评论(0) 收藏 举报
分类:

我们知道,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;
}

二、程序运行结果


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

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

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

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

c++ 类的使用 友元函数 重载运算符

#ifndef S_H_ #define S_H_ #include "iostream" class s { private: int minutes; int hours; public: ...
  • qq_25235869
  • qq_25235869
  • 2016-03-25 15:53
  • 1200

从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载

一、运算符重载 运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数...
  • Simba888888
  • Simba888888
  • 2013-07-10 16:22
  • 8073

C++友元函数以及运算符重载

一、友元函数的作用 函数的私有和保护变量在类内可以访问,在类外只可访问公有变量;派生类在类内只可访问其基类的公有变量和保护变量,在类外只可访问其公有变量(要看具体的继承类型); 因此,在有些情况下...
  • u013089125
  • u013089125
  • 2014-03-29 09:50
  • 790

c++ 类的使用 友元函数 重载运算符

#ifndef S_H_ #define S_H_ #include "iostream" class s { private: int minutes; int hours; public: ...
  • qq_25235869
  • qq_25235869
  • 2016-03-25 15:53
  • 1200

C++ 重载运算符 友元函数

C++ 重载运算符 友元函数
  • jh1513
  • jh1513
  • 2016-08-17 18:13
  • 336

解析C++中不能重载为友元函数的四个运算符

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符“=”的重载 C++规定赋值运算符“=”只能重载为类的非静态成...
  • qq_34681261
  • qq_34681261
  • 2017-05-21 23:00
  • 117

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

1.运算符重载:例如+本来是用于两个整数或者两个浮点数进行相加的,如果我将+重载之后,可将+用于时间对象的相加,比如一个时间对象为1小时50分,一个时间对象为2小时30分,则这样两个时间对象通过重载的...
  • liuwei271551048
  • liuwei271551048
  • 2014-04-20 21:03
  • 959

C++运算符重载及友元函数-练习题

头文件complex0.h #pragma once #include class complex0 { double real; double img; public: complex0(...
  • sinat_20396827
  • sinat_20396827
  • 2016-04-04 20:28
  • 174

C++运算符重载,友元函数

C++运算符重载函数和友元函数是一起的,所以一起写 C++运算符重载函数 C++允许运算符重载,带来了很多的便利 下面的是一个代码例子(从代码里面上,我们可以两个类相加,实现其特定功能)...
  • zycxnanwang
  • zycxnanwang
  • 2016-11-22 20:35
  • 256

解析C++中不能重载为友元函数的四个运算符

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符“=”的重载 C++规定赋值运算符“=”只能重载为类的非静态成...
  • imxiangzi
  • imxiangzi
  • 2016-02-23 12:05
  • 323
    个人资料
    • 访问:5304388次
    • 积分:61621
    • 等级:
    • 排名:第50名
    • 原创:427篇
    • 转载:3852篇
    • 译文:0篇
    • 评论:335条
    最新评论