运算符重载(二)

《运算符重载(一)》我们介绍了运算符重载的基本概念,以及基本形式。那么再运算符重载中,参数的传递有什么遵循的原则?返回值的类型又遵循什么原则呢?这些问题都 在这一篇文章中回答。

(1)运算符重载函数中的参数个数应该有几个

运算符重载函数的参数个数取决于两个因素。一是运算符是一元运算符还是二元运算符,二是采用友元函数重载还是采用成员函数重载

如果是一元运算符,采用友元函数重载就要有一个参数,采用成员函数重载,就不需要参数(因为成员函数隐式的传递了this指针)

1 class Integer{
2      int i;
3 public:
4 };
1 friend const Integer& operator++(Integer& a);//前置++,一元运算符,采用的是友元函数重载
1 const Integer& operator++();//前置++,一元运算符,采用的是成员函数重载

如果是二元运算符,采用友元函数重载需要两个参数,采用成员函数重载,需要一个参数(因为成员函数隐式的传递了this指针)。这里就不再举例子了

(2)重载运算符函数参数的类型应该怎么选择


首先由于参数传递时,如果采用按值传递,那么就会生成临时对象,调用拷贝构造函数等,会严重影响程序的效率,所以一般采用引用的形式。如果传递的参数需要在函数中被修改,不能用const引用,如果在函数中没有修改参数,那么就传递const 引用。

(3)返回值的类型应该是引用还是应该是值类型

返回值类型根据返回的是否为新产生的对象,还是原来传递给函数的对象。如果是新产生的对象,则返回值类型为值类型。如果返回的值为原来参数传递给函数的,则返回值类型为引用

#ifndef INTEGER_H
#define INTEGER_H
#include<iostream>
class Integer
{
    long i;
public:
    Integer(int ll = 0) :i(ll){}
    ~Integer(){}

    //operators that create new ,modified value:运算符创建新的对象,并修改了值    //+ - * / % ^ | & >> <<,这些运算符是二元运算符,运算符的两个参数在函数中都没有被改变,所以都是以const 引用的形式传递的    //这些函数在是实现都是生成了另外一个新的Integer对象,并且返回这个新对象,例如+号运算符重载的实现是,return Integer(left.i+right.i);所以函数返回值是const Integer 而不是const Integer&。     //至于返回值是否加const,那就需要根据情况判定了,返回值需要调用非const函数,那么就不能加const。不需要就可以加const
    friend const Integer operator+(const Integer& left, const Integer& right);
    friend const Integer operator-(const Integer& left, const Integer& right);
    friend const Integer operator*(const Integer& left, const Integer& right);
    friend const Integer operator/(const Integer& left, const Integer& right);
    friend const Integer operator%(const Integer& left, const Integer& right);
    friend const Integer operator^(const Integer& left, const Integer& right);
    friend const Integer operator|(const Integer& left, const Integer& right);
    friend const Integer operator&(const Integer& left, const Integer& right);
    friend const Integer operator>>(const Integer& left, const Integer& right);
    friend const Integer operator<<(const Integer& left, const Integer& right);

    //Assignments modify & return lvalue 赋值运算符,并返回左值    //下面这些运算符都是改变了运算符左边的操作数,右边的操作数没有被改变,所以第一个参数是非const的引用,右边的参数是const引用
//这些函数在是实现都是没有在函数内生成新对象,返回的值也是函数传递进入的引用,例如+=运算符重载的实现是,left.i+=right.i; return left;所以函数返回值是const Integer& 而不是const Integer。   //至于返回值是否加const,那就需要根据情况判定了,返回值需要调用非const函数,那么就不能加const。不需要就可以加const
    friend Integer& operator+=(Integer& left,const Integer& right);
    friend Integer& operator-=(Integer& left, const Integer& right);
    friend Integer& operator*=(Integer& left, const Integer& right);
    friend Integer& operator/=(Integer& left, const Integer& right);
    friend Integer& operator%=(Integer& left, const Integer& right);
    friend Integer& operator^=(Integer& left, const Integer& right);
    friend Integer& operator&=(Integer& left, const Integer& right);
    friend Integer& operator|=(Integer& left, const Integer& right);
    friend Integer& operator>>=(Integer& left, const Integer& right);
    friend Integer& operator<<=(Integer& left, const Integer& right);

    //conditional operator return true/false  //
    friend int operator==(const Integer& left,const Integer& right);
    friend int operator!=(const Integer& left, const Integer& right);
    friend int operator<(const Integer& left, const Integer& right);
    friend int operator<=(const Integer& left, const Integer& right);
    friend int operator>(const Integer& left, const Integer& right);
    friend int operator>=(const Integer& left, const Integer& right);
    friend int operator&&(const Integer& left, const Integer& right);
    friend int operator||(const Integer& left, const Integer& right);

    //write the contents to an ostream
    void print(std::ostream& os)const { os << i; }//这边要特别注意是,print函数是const成员函数,只能const对象调用
};
#endif //INTEGER_Hd
时间: 2024-12-10 04:13:46

运算符重载(二)的相关文章

c++之运算符重载二

重载++和-- 设  A  Aobject : 运算符 ++和 - - 有两种方式: 前置方式:   ++Aobject  --Aobject 一元  成员函数  重载  A :: A operator++ () ; 解释为:  Aobject . operator ++( ) ; 友元函数  重载  friend A operator++ (A &) ; 解释为:   operator ++( Aobject ) ; 后置方式:  Aobject ++  Aobject 二元  成员函数  重

第八周项目 二 【项目2-Time类中的运算符重载】

[项目2-Time类中的运算符重载] 实现Time类中的运算符重载. [cpp] view plaincopyprint? class CTime { private: unsigned short int hour;    // 时 unsigned short int minute;  // 分 unsigned short int second;  // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,i

sdut 面向对象程序设计上机练习十二(运算符重载)

面向对象程序设计上机练习十二(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描述 处理一个复数与一个double数相加的运算,结果存放在一个double型变量d1中,输出d1的值.定义Complex(复数)类,在成员函数中包含重载类型转换运算符:operator double(){return real;} 输入 输入占两行: 第1行是一个复数的实部和虚部,数据以空格分开. 第2行是一个实数. 输出 输出占一行,复数的实部和实数之和,小数点后保

第九周项目二-Time类中的运算符重载(续)

<span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">在Time类中的运算符重载基础上</span><br style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height:

第九周 项目二-Time类中的运算符重载(续)

在Time类中的运算符重载基础上 (1)定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CTime operator++();//前置++,下一秒,前置与后置返回值不一样 CTime operator--( int);//后置--,前一秒 CTime operator--();//前置--,前一秒 (2)定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起

第八周项目二-Time类中的运算符重载

实现Time类中的运算符重载 class CTime { private: unsigned short int hour; // 时 unsigned short int minute; // 分 unsigned short int second; // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,int s); void display(); //二目的比较运算符重载 bool operator >

c#语法基础(二)——运算符重载

c#允许用户定义的类型,通过使用operator关键字定义静态成员函数来重载运算符 下面来看一个例子: public class ComplexNumber { private int real; private int imaginary; //构造器 public ComplexNumber(int r, int i) { real = r; imaginary = i; } //重载ToString方法,用来显示ComplexNumber public override string To

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

【C++】运算符重载

这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了. 下面用一个简单的程序说明这个问题: 声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据.只是打印的时候,打成二维数组的样子 实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算符重载. 实现a+b,返回另一个相加之后的矩阵c. 也就是说做到如下图的效果: 代码如下: #includ