C++ 重载操作符- 01 简单的入门
重载操作符的定义
这篇博客是对 重载操作符 的一个概要性的介绍。
重载操作符是C++语言的高级功能,当我们写一个类的时候,可以根据需要学一个重载操作符,如果 不需要,我们可以不写。
大量的操作符都可以重载。可以重载的操作符有42个。
有4个操作符是不可以重载的。
下面写几个例子,来看看,如何重载操作符。
#include <iostream>
using namespace std;
int main(){
int a, b;
a = 12;
b = 9;
cout << a + b << endl;
cout << "Hello" << endl;
system("pause");
return 0;
}
上面的代码中的 + ,因为C++已经做好了 int 变量类型的 加法,所以这段代码是可以运行的。
但是如果是我们自己写的类,看看下面的程序可不可以运行:
#include <iostream>
using namespace std;
class Person{
};
int main(){
int a, b;
a = 12;
b = 9;
cout << a + b << endl;
Person p1, p2;
p1 + p2;
cout << "Hello" << endl;
system("pause");
return 0;
}
上面这段程序编译都通过不了。这里我想将 p1 和 p2 相加起来,就像 a 和 b 两个int 类型的数据相加一样。是不行的,因为C++它不知道如何对这两对象进行加法运行,因为这个Person 类是我自己写的,C++不知道如何处理Person 类的 + 运算。所以,我们不能这样写。
如果我们非要将对 Person 类进行 + 操作, 就必须要在 Person 类里面对 + 操作符进行重载。这样C++就知道了:如何去执行 p1 + p2 这行代码了。
我们写一个最简单的 + 操作符重载。+ 的重载有两个参数
class Person{
public:
//重载操作符:+
void operator+(const Person& lhs, const Person& rhs){
}
};
上面这行代码编译不通过。
其实参数写一个就可以,因为第一个隐含的参数是this 。(如果将它做为友元的话,我们就要必须写成上面这个那样,要有两个参数)
class Person{
public:
//重载操作符:+
void operator+(const Person& rhs){
cout << "执行了重载的加法操作" << endl;
}
};
现在 + 操作符重载完成了,我们子啊运行一下程序看看输出结果:
21
执行了重载的加法操作
Hello
请按任意键继续. . .
重载操作符的注意事项
重载操作符的时候,必须有一个参数的类型是 类 类型。 不允许重载 C++ 的内置类型。比如下面的代码是不允许的:
void operator+(int, int);
重载的操作符也不会改变操作符的优先级。 我们都知道:先做乘除,后做加减。几十个操作符是有优先级的,并不会因为我们重载了这些操作符而改变优先级,也不会改变结合性。
而且我们重载的操作符也不会进行短路计算。逻辑与(&&)、逻辑或(||) 是具有短路操作功能的,那么我们在重载了之后,它就不具备短路操作的功能了。所以一遍情况下,我们也不要去重载 逻辑与(&&)、逻辑或(||)。这些操作符都不要去重载。
还有 取地址操作符(&) 和 逗号操作符(,) 都不要去重载,它们是可以重载的,但是不建议重载。
重载操作符实际上是一个函数,只是这个函数的名称比较怪,叫:operator+ , 那么这个函数可以作为类的成员函数,也可以作为类的非成员函数。一遍情况下,我们将算数操作(加减乘除) 和 关系操作(大于、等于、小于、不等于)作为非成员函数,但是赋值操作,我们一般将其作为成员函数。
如果重载操作符函数是非成员函数的话,就要把它在类里面定义成友元函数 。
我们说过:重载操作符就是一个函数,只是它的函数名太奇怪了(例如:+ 操作符,重载它的函数名是:operator+ )。那么在调用的时候,我们可以使用正常调用函数的方式来调用它:operator+(item1, item2),这样写的代码是可以正常运行的。但是这样的方式我们是不希望的,如果我们这样使用重载操作符的话,还不如直接定义一个功能函数(比如函数名设计成:addItem(item1, item2))。
我们最希望使用的调用方式是:item1 + item2 。这是我们最熟悉的方式,我们从小学的时候就开始使用这种方式。所以我们对 item1 + item2 这种写法特别的喜欢。
有4个操作符,如果你想重载它,就必须定义为类的成员函数。这4个操作符是: =(赋值操作)、[](下标操作)、()(函数调用操作)、->(成员访问操作)。 就是这4个操作符,如何我们重载,就必须定义为成员函数,不能定义成飞成员函数。
其他的操作符重载,是可以随意选择的,可以定义为成员函数,也可以定义定义成非成员函数,都可以。比如:++、--、== 这些操作符等等。
这篇博客,是对重载操作符 的一个概要性的介绍,后面的博客里面,我们会详细的介绍一些重载操作符要如何编写代码,来实现。
C++ 重载操作符- 01 简单的入门的更多相关文章
- C++ 重载操作符与转换
<C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...
- 重载操作符 operator overloading 学习笔记
重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...
- C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符
重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...
- C++ Primer 学习笔记_61_重载操作符与转换 --自增/自减操作符
重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪 ...
- C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象
重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int v ...
- 《C++ Primer》之重载操作符与转换(中)
赋值操作符 类赋值操作符接受类类型形参,通常,该形参是对类类型的 const 引用,但也可以是类类型或对类类型的非 const 引用.如果没有定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成 ...
- 《C++ Primer》之重载操作符与转换(下)
转换与类类型 可用一个实参调用的非 explicit 构造函数定义一个隐式转换.当提供了实参类型的对象而需要一个类类型的对象时,编译器将使用该转换.这种构造函数定义了到类类型的转换.除了定义到类类型的 ...
- 5.3 C++用顶层函数重载操作符
参考:http://www.weixueyuan.net/view/6381.html 总结: 可以将操作符重载函数声明为顶层函数. 如果以顶层函数的形式重载操作符时,二元操作符重载函数必须有两个参数 ...
- Tensoflw.js - 01 - 安装与入门(中文注释)
Tensoflw.js - 01 - 安装与入门(中文注释) 参考 W3Cschool 文档:https://www.w3cschool.cn/tensorflowjs/ 本文主要翻译一些英文注释,添 ...
随机推荐
- python之pandas数据筛选和csv操作
本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...
- Chrome 的书签太多如何分类整理比较好
对于Chrome书签太多,如何进行分类整理,下面给出几种方法~ 工具/原料 电脑 Chrome浏览器 delicious.Diigo等 方法/步骤1 1.把书签中常用网站只保存LOGO,放在书签栏最前 ...
- Asp.Net 构架(HttpModule 介绍) - Part.3
引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler接口的类进 ...
- android jUnit test 进行自动化测试
一. 被test的工程: 新建一个android工程:D_session:它有一个activity:D_sessionActivity:package名:com.mysession 二.测试工程: 新 ...
- Python学习笔记之os模块
Python中的os提供了非常丰富的方法用来处理文件和目录,下面我们将详细的介绍os相关的一些方法和函数: os 路径相关的函数: 1.os.listdir(dirname):列出dirname目录下 ...
- FPGA中的“门”
逻辑门 在ASIC的世界里,衡量器件容量的常用标准是等效门.这是因为不同的厂商在单元库里提供了不同的功能模块,而每个功能模块的实现都要求不同数量的晶体管.这样在两个器件之间比较容量和复杂度就很困难. ...
- GOF23设计模式之建造者模式(builder)
一.建造者模式概述 建造者模式的本质: 1.分离了对象子组件的单独构造(由Builder负责)和装配(由Director负责).从而可以构造出复杂的对象.这个模式适用于:某个对象的过程复杂的情况下使用 ...
- sql中case when的简单使用
这是一个很多博客都引用的博客,作者未知,但是我第一次看到的就是这个,所以置顶这个吧, 这里有两个我刚才使用的列子: --查询同一机构的签约数和解约数: select t.sgn_acct_issr_i ...
- WCF服务端返回:(413) Request Entity Too Large
出现这个原因我们应该都能猜测到,文件传出过大,超出了WCF默认范围,那么我们需要进行修改. 服务端和客户端都需要修改. 第一.客户端: <system.serviceModel> < ...
- 关于datatable对象的用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...