运算符重载为成员函数

运算符重载实质上就是通过函数重载,重载为成员函数,它就可以自由的访问本类的数据成员,实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,左操作数是对象本身的数据,由this指针指出,就不再需要任何参数。下面分别介绍这两种情况。

对于双目运算符B,如果要重载为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为A类的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。经过重载之后,表达式就相当于函数调用orpd.operator B(oprd2).

对于前置单目运算符U,如“-”(负号)等,如果要重载为类的成员函数,用来实现表达式U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,函数没有形参,经过重载之后,表达式U oprd相当于函数调用oprd.operator U().

再来看看后置运算符“++”和“–”,如果要重载为类的成员函数,用来实现表达式oprd++或oprd–,其中oprd为A类的对象,那么运算符就应当重载为A类的成员函数,这时函数要带有一个整型(int)形参。重载之后,表达式oprd就相当于调用oprd.oprator++(0)和oprd.oprator–(0)。这里的int类型参数在运算中不起任何作用,只是区别于前置后置。

复数类加减法运算重载为成员函数形式

 #include<iostream>
 #include<cassert>
using namespace std;
class complex
{
public:
    complex(double r=0.0,double i=0.0):real(r),imag(i){}
    complex operator+(const complex &c2) const;//运算符+重载成员函数
    complex operator-(const complex &c2) const;//运算符-重载成员函数
    void display() const;
private:
    double real;
    double imag;
};
complex complex::operator+(const complex &c2) const
{
    return complex(real+c2.real,imag+c2.imag);//创建一个临时无名对象作为返回值
}
complex complex::operator-(const complex &c2) const
{
    return complex(real-c2.real,imag-c2.imag);
}
void complex::display() const
{
    cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
    complex c1(5,4),c2(2,10),c3;
    cout<<"c1="; c1.display();
    cout<<"c2="; c2.display();
    c3=c1-c2;//使用重载运算符完成复数减法
    cout<<"c3=c1-c2="; c3.display();
    c3=c1+c2;
    cout<<"c3=c1+c2="; c3.display();
    return 0;
}

将单目运算符“++”重载为成员函数形式。

 #include<iostream>
 #include<cassert>
using namespace std;
class clock
{
    public:
        clock(int hour=0,int minute=0,int second=0);
        void showtime() const;
        clock& operator++();
        clock operator++(int);
    private:
        int hour,minute,second;
};
clock::clock(int hour,int minute,int second)
{
    if(0<=hour&&hour<24&&0<=minute&&minute<60&&0<=second&&second<60)
    {
        this->hour=hour;
        this->minute=minute;
        this->second=second;
    }
    else
    {
        cout<<"time error!"<<endl;
    }
}
void clock::showtime() const
{
    cout<<hour<<":"<<minute<<":"<<second<<endl;
}
clock &clock::operator++()//前置单目运算符重载函数
{
    second++;
    if(second>=60)
    {
        second-=60;
        minute++;
        if(minute>=60)
        {
            minute-=60;
            hour=(hour+1)%24;
        }
    }
    return *this;
}
clock clock::operator++(int)//后置单目运算符重载
{
    clock old=*this;
    ++(*this);//调用前置“++”运算符
    return old;
}
int main()
{
    clock myclock(23,59,59);
    cout<<"first time output: ";
    myclock.showtime();
    cout<<"show myclock++   ";
    (myclock++).showtime();
    cout<<"show ++myclock   ";
    (++myclock).showtime();
    return 0;
}

时间: 2024-10-14 00:54:42

运算符重载为成员函数的相关文章

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

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

C++运算符重载为成员函数

#include<iostream> using namespace std; class Complex{ public: Complex(double r=0.0,double i=0.0):real(r),imag(i){} Complex operator + (const Complex &c2) const; Complex operator - (const Complex &c2) const; void display() const; private: do

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

我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数.但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->. 重载为友元函数的运算符重载函数的定义格式如下: [cpp] view plaincopy 一.程序实例 [cpp] view plaincopy 1 //运算符重载:友元函数方式 2

C++运算符重载为友元函数学习笔记

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 下面的两种情况发生,则我们需要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能访问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

对运算符重载和友元函数的例子

以下是博主在学习完运算符重载和友元函数后编写的一个例子,实现一个复数的基本运算.定义的头文件: /****************************************************************** complex.h Defination of the complex ******************************************************************/ #ifndef _complex_ #define _com

重载运算符:类成员函数or友元函数

类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(const point &a,const point &b) { return a.x==b.x; } 两种重载方式的比较: (1)单目运算符.=.().[].->使用类成员函数,其它双目运算符使用友元函数 (2)类型转换函数只能定义为类成员函数 (3)运算会修改类成员是使用类成员函数 (4

C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函数调用的方式,只有在设计涉及的代码更容易写,尤其是更容易读的时候才有必要重载. 2.实现运算符重载的方式 类的成员函数 友元函数(即类外的普通函数) 3.运算符重载的原则: 不能重载的运算符有5个:  .  .*  ?: ::  sizeof 运算符重载不允许发明新的运算符 不能改变运算符操作对象的

运算符重载为友元函数,或者普通函数

重载为友元函数时,一般先在类内用friend关键字声明,然后在类外具体实现(具体实现时不需friend,也不需类名) 重载为普通函数时,直接在类外给出函数实现即可(也不需要类名): 二者的区别在于友元函数对类的数据成员有直接获取权限,而普通函数还要通过类的接口访问数据成员. 还有一种是运算符重载为类的成员函数.同友元类似,成员也有直接访问私有数据成员的权限. 那么什么时候重载为成员,什么时候重载为友元呢?

第八周(运算符重载)一般函数

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第八周(运算符重载) *作者:王忠 *完成日期:2015.4.28 *版本号:v1.0 * *问题描述:请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 *输入描述: *程序输出: #include <iostream> using namespace std; class Complex { public: Complex(){real=0;i