C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数

在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数。

1. 定义成员运算符重载函数的语法形式
(1)在类的内部,定义成员运算符重载函数的格式如下:
函数类型 operator 运算符(形参表)
{
       函数体
}

(2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义。

在类的内部,声明成员运算符重载函数原型的格式如下:
class X{
      ...
      函数类型 operator运算符(参数表);
};
在类的外部定义,定义成员运算符重载函数原型的格式如下:
函数类型 operator运算符(参数表)
{
      函数体
}

其中,X是友元函数的运算符重载函数所在类的类名;函数类型指定了成员运算符函数的返回值类型;operator是定义运算符重载函数的关键字;运算符即是要重载的运算符名称,必须是C++中可重载的运算符;形参表中给出重载运算符所需要的参数和类型。由于成员运算符重载函数是该类的成员函数,所以在类外定义时必须缀上类名。

注意:在成员运算符重载函数的形参表中,若运算符是单目的,则参数表为空;若运算符是双目的,则参数表中有一个操作数。

2. 双目运算符重载

对双目运算符而言,成员运算符重载函数的形参表中仅有一个参数,它作为运算符的右操作数。另一个操作数(左操作数)是隐含的,是该类的当前对象,它是通过this指针隐含地传递给函数的。例如

calss X{
       ...
       int operator+(X a);
       ...
};
在类中声明重载"+"的成员运算符重载函数,返回类型为int,它具有两个操作数,一个是当前对象,另一个是类X的对象a。

例5.5 用成员运算符重载函数进行复数的运算。
加法:(a+bi)+(c+di)=(a+c)+(b+d)i
减法:(a-bi)+(c-di)=(a-c)+(b-d)i
乘法:(a-bi)*(c-di)=(ac-bd)+(ad+bc)i
除法:(a-bi)/(c-di)=(a+bi)*(c-di)/(c*c+d*d)

#include<iostream>
using namespace std;
class Complex{
  public:
    Complex(){};
    Complex(double r,double i)
    {
     real = r;
     imag = i;
    }
    void print();
    Complex operator+(Complex co);  //声明运算符+的重载函数
    Complex operator-(Complex co);  //声明运算符-的重载函数
    Complex operator*(Complex co);  //声明运算符*的重载函数
    Complex operator/(Complex co);  //声明运算符/的重载函数
  private:
    double real;//复数的实部
    double imag;//复数的虚部
};
Complex Complex::operator+(Complex co)  //定义运算符+的重载函数
{
 Complex temp;
 temp.real = real+co.real;
 temp.imag = imag+co.imag;
 return temp;
}
Complex Complex::operator-(Complex co)  //定义运算符-的重载函数
{
 Complex temp;
 temp.real = real-co.real;
 temp.imag = imag-co.imag;
 return temp;
}
Complex Complex::operator*(Complex co)  //定义运算符*的重载函数
{
 Complex temp;
 temp.real = real*co.real-imag*co.imag;
 temp.imag = real*co.imag+imag*co.real;
 return temp;
}
Complex Complex::operator/(Complex co)  //定义运算符/的重载函数
{
 Complex temp;
 double t;
 t = 1/(co.real*co.real+co.imag*co.imag);
 temp.real = (real*co.real+imag*co.imag)*t;
 temp.imag = (co.real*imag-real*co.imag)*t;
 return temp;
}
void Complex::print()
{
 cout<<real;
 cout<<"+"<<imag<<‘i‘<<endl;
}
int main()
{
 Complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;
 A3 = A1+A2; //A3 = A1.operaotr+(A2)
 A4 = A1-A2; //A3 = A1.operaotr-(A2)
 A5 = A1*A2; //A3 = A1.operaotr*(A2)
 A6 = A1/A2; //A3 = A1.operaotr/(A2)
 A1.print();
 A2.print();
 A3.print();
 A4.print();
 A5.print();
 A6.print();
 return 0;
}
/*
 一般而言,如果在类X中采用成员函数重载双目运算符@,成员运算符函数[email protected]所需要的
 一个操作数由对象aa通过this指针隐含地传递,它的另一个操作数bb在参数表中显示,则以下
 两种函数调用方法是等价的。

      [email protected];                 //隐式调用
      [email protected](bb);      //显示调用
*/ 

3. (成员运算符重载函数)单目运算符重载

对单目运算符而言,成员运算符重载函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。

//例5.6 用成员函数重载单目运算符"++"

#include<iostream>
using namespace std;
class Coord{
 public:
  Coord(int i=0,int j=0)
  {
   x = i;
   y = j;
  }
  Coord operator++();        //声明成员运算符++重载函数
  //void operator++();
  void print();
 private:
  int x,y;
};
Coord Coord::operator++()   //定义成员运算符++重载函数
{
 ++x;
 ++y;
 return *this;              //返回当前对象的值
}
/*
void Coord::operator++()
{
 ++x;
 ++y;
}
*/
void Coord::print()
{
 cout<<"x="<<x<<","<<"y="<<y<<endl;
}
int main()
{
 Coord c(10,20);
 c.print();

 ++c;            //隐式调用
 c.print();

 c.operator++(); //显示调用
 c.print();

 return 0;
}
/*
  本例中主函数中调用成员运算符重载函数operator的两种方式是等价的。
    即  ++c ========== c.operator++()

  其格式为:     @aa;             //隐式调用
                aa.operator();   //显示调用

  从本例中还可以看出,当用成员函数重载单目运算时,没有参数被显示地传递给成员运算符
  。参数是通过this指针隐含地传递给函数              

*/
时间: 2024-10-08 20:50:25

C++:运算符重载函数之成员运算符重载函数的相关文章

C++重载(主要介绍使用友元函数重载)

重载限制 多数C++运算符都可以用下面的方式重载.重载的运算符不必是成员函数,但必须至少有一个操作数是用户自定义的类型.下面详细介绍C++对用户定义的运算符重载的限制. 1 重载后的运算符必须至少有一个操作数是用户自定义的类型,这将防止用户为标准类型重载运算符.因此,不能将减法运算符(-)重载为double值的和,而不是它们的差.虽然这种限制将对创造性有所影响,但可以确保程序正常运行. 2 使用运算符时不能违反运算符原来的句法规则.例如,不能将求模运算符(%)重载成使用一个操作数. 同样,不能修

7. Python运算符之逻辑、成员、身份运算符及优先级

运算符 逻辑表达式 描述 and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值. or x or y 布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值. not not x 布尔"非" - 如果 x 为 True,返回 False .如果 x 为 False,它返回 True. 我们使用上面逻辑运算符进行运算,如下代码所示: a = 5 b =

思考: 对于一个要重载的运算符而言,什么样的运算符应该用类成员函数重载,什么情况应该用友元函数重载??

还是用一个例子来说明吧 1 #define unsigned int UINT32 2 3 class RMB 4 { 5 public: 6 RMB(UINT32 d, UINT32 c); 7 friend RMB operator +(RMB&, RMB&); 8 friend RMB& operator ++(RMB&); 9 void display() 10 { 11 cout<<(yuan + jf / 100.0)<<endl; 12

运算符重载(作为成员函数)

运算符重载---基本概念 C++程序设计 郭炜 刘家瑛 1 #include<iostream> 2 using namespace std; 3 class Complex{ 4 private: 5 double real; 6 double imaginary; 7 public: 8 Complex(double a=0.0,double b=0.0) : real(a),imaginary(b) {}//初始化 9 ~Complex(){} 10 Complex operator+(

编写高质量代码——运算符重载,是成员函数还是友元函数

一.运算符重载的四项基本原则: ▍不可臆造运算符. ▍运算符原有操作数的个数.优先级和结合性不能改变. ▍操作数中至少一个是自定义类型. ▍保持运算符的自然含义. ============================== 二.运算符重载的两种形式: ▍成员函数形式(隐含一个参数 this 指针): 1)双目运算符:参数一个 2)单目运算符:不能显示的声明参数 ▍友元函数形式(不存在隐含的参数 this 指针) 1)双目运算符:两个参数 2)单目运算符:一个参数 ===============

c++语言友元函数和成员函数对运算符重载

#include<iostream> using namespace std; /******************************************/ /*use member function to overload operator*/ /******************************************/ class RMB{ public: RMB(unsigned int d, unsigned int c); RMB operator + (RM

加法运算符重载为从成员函数执行过程

今天学习了运算符重载函数,测试了复数类加减运算符的重载,不明白运算符重载函数的执行过程,重点探究一下: 首先贴出源代码 // example_1_2_cl_dt_fushujiajian.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; class complex { public: complex(double r=0.0,double i=0.0){re

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

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

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }