运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能。这个函数叫做运算符重载函数(常为类的成员函数)。

方法与解释

◆ 1、定义运算符重载函数的一般格式:
    返回值类型 类名::operator重载的运算符(参数表)
    {……}
operator是关键字,它与重载的运算符一起构成函数名。

例如定义复数相加:
complex complex::operator+(const complex &c)
{
       complex Temp(real+c.real , Image+c.Image) ;
       //创建了一个显式的局部对象Temp
       return Temp;
}

◆ 2、【例4.8】定义了复数类,可完成复数基本运算,并应用它进行复数运算。
在本例中重载了运算符“+”、“=”、“+=”和“*”、“/”,以及求模(绝对值)的函数abs(),可以进行复数运算。

(1)在做 c=c2+c3时,C++编译器把表达式c2+c3解释为: c2.operator+(c3) ;

(2)可以用隐式的临时对象替换显式的对象Temp,如例中重载的operator+(double),它执行复数与实数的加法。
Complex Complex::operator+(double d)
{
       return Complex(Real+d , Image);
       //隐式说明局部对象,没名字
}

(3)
complex complex::operator+(const complex &c)
{
       return complex(real+c.real , Image+c.Image) ;
}

使用引用类型变量作为运算符重载函数的参数,可以提高复数类型运算的效率。

在引用形式参数类型说明前加const关键字,表示被引用的实参是不可改变的,如程序员不当心在函数体中重新赋值了被引用的实参,C++编译器会认为出错。例子中其它运算符也是类似处理。

(4)在缺省的情况下,C++ 编译器为每个类生成一个缺省的赋值‘=’操作,用于同类的两个对象之间的相互赋值,缺省的语义是类成员逐个相互赋值。

对复数类 complex 如果没有重载赋值运算符 =,复数的缺省赋值语义是:
Complex &Complex::operator = (Complex& c)
{
       real = c.real;
       image = c.image
       return *this;
}

这种缺省的赋值操作格式对所有类是固定的,这种缺省的格式对复数是合适的,但对其他类缺省的赋值可能产生问题,那时就需要重载‘=’。

因为缺省的赋值操作返回一个复数的引用,所以它可以进行连续赋值如:a=b=c=d ;

(5)重载的运算符“+=”标准算法是:
Complex& Complex::operator +=(Complex & com)
{
       real += com.real;
       image += com.image;
       return *this;
}

运算符重载小结

◆ 1、运算符重载函数的函数名必须为关键字operator加一个合法的运算符。在调用该函数时,将右操作数作为函数的实参。

◆ 2、当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个或(当为单目运算符时)没有。运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数,其类型并无严格限制。C++不允许重载三目运算符。

◆ 3、单目运算符“++”和“--”存在前置与后置问题。

  • 前置“++”格式为:返回类型 类名::operator++(){……}
  • 而后置“++”格式为:返回类型 类名::operator++(int){……}

后置“++”中的参数int仅用作区分,并无实际意义,可以给一个变量名,也可以不给变量名。

◆ 4、C++中只有极少数的运算符不允许重载,表4.1中列出了不允许重载的运算符。

我的c++学习(8)运算符重载和友元的更多相关文章

  1. C++学习之运算符重载的总结

    C++学习之运算符重载的总结              运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...

  2. c++入门之—运算符重载和友元函数

    运算符重载的意义是:将常见的运算符重载出其他的含义:比如将*重载出指针的含义,将<<与cout联合使用重载出输出的含义,但需要认识到的问题是:运算符的重载:本质仍然是成员函数,即你可以认为 ...

  3. C++学习26 运算符重载的概念和语法

    所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...

  4. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  5. C++抽象编程·运算符重载与友元函数

    运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其 ...

  6. CPP_运算符重载及友元

    运算符重载 两种重载方法1)成员函数 a + b => a.operator+(b); 一个参数 2)友元函数 a + b => operator+(a, b); 两个参数. friend ...

  7. C++运算符重载 模板友元 new delete ++ = +=

    今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写 ...

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

    我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...

  9. STL学习之运算符(<<)重载问题和仿函数的实现

    /*   运算符<<的重载一直报错,   友原函数中可以访问到类的私有成员*/#include<iostream>using namespace std; class MyIn ...

随机推荐

  1. UVA 156 Ananagrams ---map

    题目链接 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列( ...

  2. php面向对象中的静态与抽象,接口

    静态又包括: 普通成员: 普通成员是属于对象的 静态成员: 静态成员是属于类的 关键字:static self关键字:在类里面代表该类,前面不用加$ 在静态方法里面不能调用普通成员 在普通方法里面能够 ...

  3. iOS中UITableView的一些设置

    不可滑动: ? 1 tableView.userInteractionEnabled = NO; 也可以在storyboard中的userInteractionEnable属性设置 显示导向箭头: ? ...

  4. [Usaco2015 Feb]Censoring(bzoj 3942)

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  5. Android ArrayAdapter使用

    1. 可以直接使用getContext()获取Context对象 2. 可以在构造方法中传入context, 数据对象的列表, super(context, 0, object);完成Adapter的 ...

  6. 从xml中构建sqlSessionFactory

    String resource = "org/mybatis/example/Configuration.xml"; Reader reader = Resources.getRe ...

  7. hdu 5108 Alexandra and Prime Numbers

    数论题,本质是求出n的最大质因子 #include<time.h> #include <cstdio> #include <iostream> #include&l ...

  8. hdu 1290 切糕

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1290 思路: n条直线最多能将一个平面分成几个区域其递推公式即为:f(n)=f(n-1)+n:递推一下 ...

  9. 重温WCF之消息拦截与篡改(八)

    我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...

  10. 【JAVA之泛型】

    一.引例. 1.引例. 假设现在有一个ArrayList的容器,如果不使用泛型约束,则可以向容器中加入各种类型的对象,但是如果取出来的时候只是用一种类型的转换则肯定会抛出ClassCastExcept ...