参考:http://www.weixueyuan.net/view/6379.html

总结:

  操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。

  长度运算符“sizeof”、条件运算符“:?”成员选择符“.”、对象选择符“.*”和域解析操作符“::”不能被重载。

  调用的语法是C = A.operator+ ( B );,由于operator关键字的作用,operator+这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;

  比较规范的调用方法是C = A.operator+ ( B );,此处是A对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是A和B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。

  总之,因为它是对象的成员函数。

操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。

在C++中可以重载的操作符有:
+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |= 
<<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  [] 
new  new[]  delete  delete[]

上述操作符中,[]操作符是下标操作符,()操作符是函数调用操作符。自增自减操作符的前置和后置形式都可以重载。长度运算符“sizeof”、条件运算符“:?”成员选择符“.”、对象选择符“.*”和域解析操作符“::”不能被重载。

为了介绍基本操作符的重载,我们先来看一个操作符重载的示例。

例1:

#include <iostream>
using namespace std; class complex
{
public:
complex();
complex(double a);
complex(double a, double b);
complex operator+(const complex & A)const;
complex operator-(const complex & A)const;
complex operator*(const complex & A)const;
complex operator/(const complex & A)const;
void display()const;
private:
double real; //复数的实部
double imag; //复数的虚部
}; complex::complex()
{
real = 0.0;
imag = 0.0;
} complex::complex(double a)
{
real = a;
imag = 0.0;
} complex::complex(double a, double b)
{
real = a;
imag = b;
} //打印复数
void complex::display()const
{
cout<<real<<" + "<<imag<<" i ";
} //重载加法操作符
complex complex::operator+(const complex & A)const
{
complex B;
B.real = real + A.real;
B.imag = imag + A.imag;
return B;
} //重载减法操作符
complex complex::operator-(const complex & A)const
{
complex B;
B.real = real - A.real;
B.imag = imag - A.imag;
return B;
} //重载乘法操作符
complex complex::operator*(const complex & A)const
{
complex B;
B.real = real * A.real - imag * A.imag;
B.imag = imag * A.real + real * A.imag;
return B;
} //重载除法操作符
complex complex::operator/(const complex & A)const
{
complex B;
double square = A.real * A.real + A.imag * A.imag;
B.real = (real * A.real + imag * A.imag)/square;
B.imag = (imag * A.real - real * A.imag)/square;
return B;
} int main()
{
complex c1(4.3, -5.8);
complex c2(8.4, 6.7);
complex c3; //复数的加法
c3 = c1 + c2;
cout<<"c1 + c2 = ";
c3.display();
cout<<endl; //复数的减法
c3 = c1 - c2;
cout<<"c1 - c2 = ";
c3.display();
cout<<endl; //复数的乘法
c3 = c1 * c2;
cout<<"c1 * c2 = ";
c3.display();
cout<<endl; //复数的除法
c3 = c1 / c2;
cout<<"c1 / c2 = ";
c3.display();
cout<<endl; return ;
}
在这个例子中,我们定义了一个复数类,一个复数包含实部和虚部两部分,我们分别用real和imag来表示复数的实部和虚部,并将这两个变量作为复数类的成员变量,并设置为private属性。在复数类中,我们定义了三个构造函数用于初始化复数类的对象。之后声明了四个操作符重载函数,分别重载加减乘除四种操作符。最后定义了一个打印复数的函数display。

为了避免大家不熟悉复数的四则运算,在这里将其一一列出,以助于大家对例1的理解。
    ( 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 ) = ( ac + bd ) / ( c2 + d2 ) + [ ( bc – ad ) / ( c2 + d2 ) ]i

在例1中我们是将操作符重载函数声明为成员函数,在这个例子中我们首先需要关注的是操作符重载函数的声明。如例中所示,重载加法操作符时,其函数声明为“complex operator+(const complex & A)const;”,两个复数相加,函数返回值为complex类对象,仍然为一个复数。复数相加需要两个复数进行运行,调用函数的类对象本身就是一个复数,因此还需要另外一个复数作为参数,在该函数声明中函数的参数为复数类对象的引用,并且加上了const关键字以确保在函数中不会修改该对象的引用。我们再来看一下加法操作符重载函数的类外定义,在函数体中,我们先定义了一个复数类对象B,之后按照复数的加法运算规则将计算结果赋给B的real 和imag成员变量。由于系统会给类生成一个默认的拷贝构造函数,因此采用传值的形式将计算结果返回没有问题。

调用操作符重载函数的语法和调用普通成员函数语法相同,例如我们定义三个complex类的对象A、B和C,调用的语法是C = A.operator+ ( B );,由于operator关键字的作用,operator+这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;,采用这种方式调用operator+这个操作符重载函数,意义非常明了,在本例中我们也都是按照这种方式调用的。在本例中我们是将操作符重载函数声明为类的成员函数,在我们进行加法运算时需要两个操作数,也即需要两个复数对象,在声明操作符重载函数时,“complex operator+(const complex & A)const;”确只有一个函数参数,这一点无需奇怪,我们看其调用方式就明白了。比较规范的调用方法是C = A.operator+ ( B );,此处是A对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是A和B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。

例2:

class test
{
public:
test operator!();
};

例2中重载的是一元操作符“!”(非),因为是作为成员函数重载的,因此不需要参数。

 

5.1 C++基本操作符重载的更多相关文章

  1. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  2. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  3. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  4. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  5. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  6. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

  7. C++基础学习笔记----第十三课(操作符重载-下)

    本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...

  8. 再议Swift操作符重载

    今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ...

  9. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

  10. C++ operator overload -- 操作符重载

    C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...

随机推荐

  1. PHP curl是什么

    PHP curl是什么 一.总结 一句话总结:PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯. libcurl库 允许你与各种的 ...

  2. 我们一起学习WCF 第六篇文件传输

    原文  http://www.cnblogs.com/LipeiNet/p/4653830.html   前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...

  3. patch-test-and-proc

    实验环境 Ubuntu 14.04.5 LTS Linux - 4.15.6 为单个文件进程补丁操作 在桌面 Desktop 建立文件夹 patch ,作为实验用,然后进入patch 文件夹.建立测试 ...

  4. 20171104xlVBA进退比较

    Sub 比对两次成绩() CreateAdvance "进退比较", "月考2", "期中考", "月考2", &quo ...

  5. HDOJ 1023 Train Problem II

    考虑第1个火车出站的时刻,从1到n都有可能,如果它是第i个出栈,那么前面有规模为i-1的子问题,后面有规模为n-i的子问题.累加.

  6. 第一章:IPsecVPN

    第一章 一.VPN(virtual private Network,虚拟专用网)的基本概念 VPN连接模式分为两种,分别是传输模式和隧道模式 传输模式:在整个VPN传输中,ip包头并没有被封装进去 隧 ...

  7. BigInteger 类 和 BigDecimal 类

    一 .BigInteger BigInteger类在计算和处理任意大小的整数方面是很有用的. BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的. BigInte ...

  8. 删除 github 相应仓库下的文件(不删除仓库)

    1.git  clone url(仓库的ssh) 将仓库克隆 到本地 2.进入到本地仓库文件夹 将想要删除的文件删除 3.右键 git bash here 4.git add . 5.git comm ...

  9. appium自动化测试(四)

    一. 获取webview的html页面 方法一: 1. 获取webview中对应的html页面 谷歌浏览器中输入地址:chrome://inspect(第一次使用要FQ) 前提:手机开启USB调试模式 ...

  10. weblogic开启http访问日志并实时写入日志文件

    由于http访问会产生大量日志,耗去不少IO和CPU所以在生产一般是不启用的:但有时我们会想启用http访问日志,尤其是在系统上线调试的时候. weblogic的日志默认在domain_name/se ...