第四周:运算符重载

基本概念

运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。

运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。

同一个运算符,对不同类型的操作数,所发生的行为不同。

运算符重载的形式

1.运算符重载的实质是函数重载。

2.可以重载为普通函数,也可以重载为成员函数。

3.把含运算符的表达式转换成对运算符函数的调用。

4.把运算符的操作数转换成运算符函数的参数。

5.运算符被多次重载时,根据实参类型决定调用哪个运算符函数。

返回值类型 operator 运算符(形参表)

{....

}

注意:重载为成员函数是,参数个函数为运算符目数减一。

重载为普通函数时,参数个数为运算符目数。

运算符重载为友元函数

一般情况下,将运算符重载为类的成员函数,是较好的选择。

但有时,重载为成员函数不能满足使用要求,重载为普通函数,又不能访问类的私有成员,所以需要将运算符重载为友元。

如加号的重载,使用时必须要保证对象在符号左侧,这显然与原有的符号有一定不同。

因此我们可以把+重载为普通函数。同时将其设为要访问成员的友元。

赋值运算符的重载

有时候我们希望赋值运算符两边的类型可以不匹配,比如,把一个int类型变量赋值给一个Complex对象,或把一个char *类型字符串赋值给一个字符串对象,此时就需要重载赋值运算符“=“。

赋值运算符“=”只能重载为成员函数。 为什么有的操作符重载函数只能是成员函数?

注意:初始化时调用的是复制构造函数,而不是运算符“=”:

string s="hello"  //调用复制构造函数。
string s1("hello") //调用复制构造函数。
s="world" //调用运算符“=”。

浅拷贝与深拷贝

浅拷贝只是单纯的把两个对象的内容一致,并不能保证两个对象的成员指向的不同的地址,如果对象中的成员是地址,那么很容易造成两个对象的成员指向同一个地址。这种赋值我们称为浅拷贝,浅拷贝往往是不安全的。

深拷贝保证两个对象的地址指向的内容一致,而不是对象的地址一致。

对象缺省的赋值运算符一般执行浅拷贝,所以一般情况下我们要自己重载赋值构造函数。(对象的复制构造函数也是如此)

关于浅拷贝深拷贝以及重载赋值运算符需要注意的问题详见:=运算符重载应注意点

关于赋值运算符重载的返回值类型:

对运算符进行重载的是后,好的风格是应该尽量保留运算符原本的特性

为了支持这一特性并且支持a=b=c和(a=b)=c我们应该使用赋值左边的对象的引用作为返回类型。

流插入运算符的重载

iostream中重载了<<与>>运算符,其中有istream对象与ostream对象。

为了能支持连续运算,流运算符需要返回相应引用。

重载<<与>>运算符只能使用普通函数,因为iostrem对象已经在头文件中完成,无法再为它添加新的成员。

类型转换运算符的重载

任何类型的名字都是一个类型转换运算符(自定义类型?),其返回值都是本身的类型,比如double类型转换运算符的返回类型就是double本身。

如:

operator double(){   //注意该类型转化运算符是成员函数,
return real;
}

自增、自减运算符的重载

自增运算符++、自减运算符--有前置/后置之分,为了区分所重载的是前置运算符还是后置运算符,C++规定:

前置运算符作为一元运算符重载,后置运算符为二元运算符除了类型本身还有一个int。

后置自增自减运算符返回类型为该对象改变前的实体。

前置返回的是对象改变后的引用。

一般来说前置运算符比后置运算符要快很多,因为后置运算符需要返回实体开销较大。

关于运算符重载的其他注意点 :

1.C++不允许定义新的运算符;

2.重载后运算符的含义应该符合日常习惯;

3.运算符重载不改变运算符的优先级;

4.以下运算符不能重载:"."、".*"、"::"、"?:"、sizeof;

5.重载运算符()、[]、->或者赋值运算符,运算符重载函数必须声明为类的成员函数。

MOOC C++笔记(四):运算符重载的更多相关文章

  1. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  2. C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符

    1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函 ...

  3. 《Inside C#》笔记(十一) 运算符重载

    运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...

  4. (C/C++学习笔记) 四. 运算符

    四. 运算符 运算符优先级和结合性 Operator precedence and associativity (or fixity) 注意: ① 成员运算符MemberOperators可以称为点运 ...

  5. 新标准C++程序设计读书笔记_运算符重载

    形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...

  6. C++ Primer笔记13_运算符重载_总结

    总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则例如以下: 运算符 建议使用 ...

  7. Java学习笔记四——运算符

    算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...

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

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

  9. C++基础 学习笔记五:重载之运算符重载

    C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...

随机推荐

  1. 如何利用jenkins插件查看allure报告-----完整篇(解决404和无数据问题)

    背景: python3+appium+pytest+allure写了安卓的自动化脚本,在windows本机pycharm上跑通过后生成了allure报告.  公司jenkins搭建在linux服务器上 ...

  2. spring-boot-plus快速开始 Quick Start(一)

    spring-boot-plus快速开始 Quick Start 1. clone项目到本地 shell script git clone git@github.com:geekidea/spring ...

  3. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1

    目录 前言 拦截器 异常拦截器 测试结果 身份验证拦截器 测试 小结 补充 2019-07-31 前言 一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了 ...

  4. 小白学Python(7)——利用Requests下载网页图片、视频

    安装 Requests 如果安装了Requests就已经可用了,否则要安装 Requests,只要在你的CMD中运行这个简单命令即可: pip install requests requests使用 ...

  5. Selenium+java - 手把手一起搭建一个最简单自动化测试框架

    写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬. 来看下面一段代码,如下图所示: 从上面图片代码来看,具体特征如下: driver对象在测试类中 ...

  6. mybatis+spring+springMVC处理org.springframework.beans.factory.BeanDefinitionStoreException:java.lang.IllegalArgumentException异常

    java.lang.IllegalArgumentException异常有三种情况 org.springframework.beans.factory.BeanDefinitionStoreExcep ...

  7. 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking

    目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...

  8. JVM(十三):后端编译优化

    JVM(十三):后端编译优化 在 JVM(一):源文件的转变 中我们介绍了 Java 中的前端优化,即将 Java 源代码转换为字节码文件.在本文中,我们将介绍字节码文件如何转换为本地机器码,并如何对 ...

  9. 非域环境下SQL Server搭建Mirror(镜像)的详细步骤

    1.测试验证环境 服务器角色 机器名 IP SQL Server Ver 主体服务器 WIN-TestDB4O 172.83.XXX.XXX SQL Server 2012 - 11.0.5058.0 ...

  10. 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)

    去年秋季参加了校园招聘,有幸拿到了BAT.头条.网易.滴滴.亚马逊.华为等offer,经过研究生两年的学习积累,终于达成了自己的目标,期间也经历了很多,谨以此文,聊表感叹,也会分享很多我的Java学习 ...