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

原创 2015年07月10日 08:57:08

一、运算符重载

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;
}

三、程序运行结果



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

相关文章推荐

C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)

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

《C++第八周实验报告1-1(1)》---复数类中的运算符重载用类的成员函数完成

【任务1】实现复数类中的运算符重载 定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。 (1)方案一:请用类的成员函数完成运算符的重载; */  /* (程序头部注释开始) * 程序的...

《C++第八周实验报告1-1(1)》---复数类中的运算符重载用类的成员函数完成

/* 【任务1】实现复数类中的运算符重载 定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。 (1)方案一:请用类的成员函数完成运算符的重载; */ /* (程序头部注释开始) * 程...

C++重载运算符及const成员函数简述

ACM中,用重载函数会使解题更加方便,但是又需要像c++那样深入理解,遂简单总结了结构体中的重载运算符及const成员函数一些简单的用法. 闲言少叙,直接看代码: /** * 行有余力,则来刷...

C++类和对象、四个默认成员函数、运算符重载

C++类和对象、四个默认成员函数、运算符重载一.C++类的理解:1.类:类是面向对象的一个概念,类其实可以说是一种用户自定义的数据类型,而比基本的数据类型,比如:int、long、double等等,只...

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

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

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

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

C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex

题目要求如下: 1) 基本的构造函数; 2) 成员运算符+、-实现复数的加减运算; 3) 友元运算符+、-实现更合理的加减运算; 4) 运算符<>实现复数类的输出输入。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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