上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

首先看一下常见的重载原型

  • +-*/%^&|~  原型:const T operatorX(const T& l, const T& r) const; //注意:返回值是const T 新对象不是引用,而且不能当左值(a+b=3  这是不被允许的)
  • !&&||< <= == >= >  原型:bool operatorX(const T& l, const T& r) const;  //关系型运算符 返回值是bool
  • []  原型:T& T::operator[](int index);
  • ++ --比较复杂,原型在下面

++ --运算符重载:

//原型及部分实现
class Integer
{
public:
...
const Integer& operator++(); //++a 返回值为a+1
const Integer operator++(int); //a++ 返回值为a 然后a=a+1 注意:返回值不是引用而是新的对象
const Integer& operator--(); //--a 返回值为a-1
const Integer operator--(int); //a-- 返回值为a
}; //定义(实现)
const Integer& Integer::operator++()
{
*this += 1;
return *this;
} const Integer Integer::operator++(int)
{
Interger old(*this); //拷贝构造
++(*this);
return old;
}

[]运算符 ,最明显的例子就是vector,重载后的vector就可以进行扩展

class Vector //为了防止编译冲突我们改一下名字,第一个字母大写好了
{
public:
Vector(int size):m_size(size)
{
m_array = new int[size];
}
~Vector() { delete m_array; }
int& operator[](int index) { return m_array[index]; }
private:
int m_size;
int *m_array;
}

= 赋值运算符,这个也较复杂:复杂在哪呢,类之间的赋值有两种 一种是拷贝构造函数 一种是直接赋值

//=运算符重载原型定义
T& T::operator=(const T& rhs)
{
//check for self assignment
if( this!= &rhs)
{
//preform assignment
}
return *this;
}
MyType b;  //b走构造
MyType a=b; //a走拷贝构造 拷贝构造不能重载
a=b; //直接赋值 赋值可以被重载

看个=重载例子:

#include <iostream>
using namespace std;
class Cargo
{
public:
Cargo& operator=(const Cargo& rhs)
{
cout << "inside Cargo::operator=()" << endl;
if(this != &rhs)
{ cout << "处理不等问题"<< endl; }
return *this;
}
};
class Truck
{
Cargo b;
};
int main()
{
Cargo a; //默认构造函数
Cargo b=a; //b对象实例化走的 拷贝构造函数
b=a; //=重载
Truck c,d;
c = d; //=重载
return 0;
}

目录

  1. c++(翁恺浙大公开课) 笔记0
  2. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
  3. c++对象初始化(翁恺c++公开课[10])
  4. c++构造函数的初始化列表(翁恺c++公开课[13])
  5. c++继承:公有、私有、保护
  6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
  7. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
  8. c++多态性及多态的内部实现(翁恺c++公开课[23-24])
  9. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
  10. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
  11. c++模板(翁恺c++公开课[34-35]学习笔记)
  12. 最好不要在头文件中写函数定义

c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)的更多相关文章

  1. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  2. c++中的Exceptions异常处理(翁恺c++公开课[36])

    Exceptions用于处理Run-time Error: //文件读取的异常捕获伪代码 try{ open the file; determine its size; allocate that m ...

  3. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...

  4. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)

    这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...

  5. c++多态性及多态的内部实现(翁恺c++公开课[23-24])

    多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...

  6. c++构造函数的初始化列表(翁恺c++公开课[13])

    初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...

  7. c++对象初始化(翁恺c++公开课[10])

    c++对象初始化 就是去调用构造函数来完成初始化操作: 构造函数有无参数的构造函数.有参数构造函数.默认构造函数(编译器给我们实现的)...(拷贝构造函数之后说) 注意:默认构造函数只有在我们自己没有 ...

  8. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)

    关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...

  9. c++模板(翁恺c++公开课[34-35]学习笔记)

    为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...

随机推荐

  1. Intersection over Union(IoU) algorithms

    IoU算法可用与评估两个多维度数据的相似度,举一个实际应用,做CV,目标检测,我们需要评估模型的识别准确率,不同于二元类问题,普通的评估算法不合适,于是用到了这个算法,这个算法简单易懂,评估效果也不错 ...

  2. boolean类型set、get方法

    今天在了解lombok的时候偶然看到一个问题,在bean中存在boolean类型的数据的时候,用eclipse工具自动生成的set.get方法存在的问题. 不管变量为isXXX还是XXX时,set.g ...

  3. jsTree的checkbox默认选中和隐藏

    jstree复选框自定义显示隐藏和初始化默认选中 首先需要配置 Checkbox plugin "plugins" : ['checkbox'] 设置默认选中状态(checkbox ...

  4. 如何修改mysql 默认引擎为InnoDB?

    1.查看 MySQL支持的引擎有哪些? show engines: 结果: 由上图可以看出,只有 InnoDB 是支持事务的 2.查看默认引擎 show variables like “default ...

  5. MySQL双机热备环境搭建

    一.    前期准备 准备两台服务器(电脑),接入到同一局域网中,能够使双方可以ping通: 安装MySQL数据库,具体安装方法网上很全面,但是安装的版本需保持一致: 服务器IP地址设置. l  A服 ...

  6. IoT生态不完善、与智能电视区别不大,荣耀智慧屏概念大于实际

    编辑 | 于斌 出品 | 于见(mpyujian) 前两天,华为荣耀略显"低调"地在北京召开了一场小型的媒体沟通会.在这场沟通会上,荣耀却颇为"重磅"地推出了坊 ...

  7. disconf---分布式配置管理平台的搭建(linux版本)

    一.获取disconf的代码 地址:https://github.com/knightliao/disconf 二.搭建基础服务 ①redis,mysql,zookeeper在博主的其他博文中有相应搭 ...

  8. Vue CLI 3搭建vue+vuex 最全分析

    一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue ...

  9. RobotFramework+Selenium2环境搭建与入门实例

    一.安装包 1.Python(推荐使用ActivePython,这个版本PATH已经配好了,也安了一些像pip这样的包) ActivePython-2.7.2.5-win32-x86.msi 2.Wx ...

  10. GO面向接口

    Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. 实例 实例 /* 定义接口 */ type interface_name ...