关闭

C++运算符重载(成员函数方式)

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

一、运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样的结果呢?编译器无法给出正常的结果,因为我们需要运算符重载,给运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为,增强了运算符的普适性。



运算符重载的实质是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用达标函数,这个过程在编译过程中完成。


运算符重载规则如下: 
①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。 
②、 重载之后运算符的优先级和结合性都不会改变。 
③、 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 

C++中只有五个运算符不能被重载,它们是:成员运算符“.”指针运算符“*”作用域运算符“::”“sizeof”条件运算符“?:”。 


运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 

运算符重载为类的成员函数的一般语法形式为: 

函数类型 operator 运算符(形参表) 
{ 
	函数体;
} 
运算符重载为类的友元函数的一般语法形式为: 

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

其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。 
当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 
运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。

二、运算符重载程序例子(成员函数方式)

//运算符重载:成员函数方式
#include <iostream>
using namespace std;

class complex //复数类
{
public:
	complex(){ real = imag = 0;}
	complex(double r, double i)
	{
		real = r;
		imag = i;
	}
	complex operator + (const complex &c);
	complex operator - (const complex &c);
	complex operator * (const complex &c);
	complex operator / (const complex &c);

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

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

};

inline complex complex::operator + (const complex &c) //定义为内联函数,代码复制,运算效率高
{
	return complex(real + c.real, imag + c.imag);
}

inline complex complex::operator - (const complex &c)
{
	return complex(real - c.real, imag - c.imag);
}

inline complex complex::operator * (const complex &c)
{
	return complex(real * c.real - imag * c.imag, real * c.real + imag * c.imag);
}

inline complex complex::operator / (const complex &c)
{
	return complex( (real * c.real + imag * c. imag) / (c.real * c.real + c.imag * c.imag), 
		(imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.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;
}

三、程序运行结果



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

C++成员函数的重载、覆盖与隐藏

成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...
  • sendy888
  • sendy888
  • 2007-08-11 22:24
  • 8868

C++ 类成员函数的重载(overload),重写/覆盖(override),隐藏

C++ 类层次中的同名函数,有三种关系: 重载(overload) 重写、覆盖(override) 隐藏(hide,oversee) 重载c++函数重载 相同的范围(在同一个类中) 相同的函数名字,不...
  • qq_26437925
  • qq_26437925
  • 2017-02-08 21:10
  • 683

运算符重载为成员函数

运算符重载实质上就是通过函数重载,重载为成员函数,它就可以自由的访问本类的数据成员,实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,左操作数是对象本身的数据,由this指针指出...
  • StubbornAccepted
  • StubbornAccepted
  • 2016-05-10 20:14
  • 1072

C++类默认成员函数与重载

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值。它是C++六个默认成员函数中的一个,不可谓不重要。下面便来总结一下构造函数的相关知识。 构造函数的作用 ...
  • qq_33724710
  • qq_33724710
  • 2016-05-29 20:05
  • 722

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

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

流运算符为什么不能重载为成员函数,只能用友元函数重载

一、 为什么operator 如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。。。。 而 >>  或 如果一定要声明为成员函数,只...
  • snowsnowsnow1991
  • snowsnowsnow1991
  • 2015-12-15 14:22
  • 2309

重载的操作符成员函数与非成员函数

今天看effective STL第26条条款时,发现自己之前没意识到如下的几点(看来自己的c++基础还是渣渣水平o(╯□╰)o)。 如果一个类重载操作符,当在全局域内也重载了同样的操作符,那么在调用该...
  • AQ14AQ1
  • AQ14AQ1
  • 2015-11-03 22:37
  • 1418

详解C++中的函数调用和下标以及成员访问运算符的重载

http://www.jb51.net/article/78436.htm 这篇文章主要介绍了详解C++中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友...
  • sinat_35297665
  • sinat_35297665
  • 2017-11-03 17:08
  • 59

成员函数重载运算符和友元函数重载运算符的比较

1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。   对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运...
  • u011450537
  • u011450537
  • 2014-11-13 10:26
  • 2782

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),...
  • u014610226
  • u014610226
  • 2015-08-15 09:49
  • 1870
    个人资料
    • 访问:5338254次
    • 积分:61921
    • 等级:
    • 排名:第48名
    • 原创:427篇
    • 转载:3852篇
    • 译文:0篇
    • 评论:338条
    最新评论