C++重载运算符简单总结
当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。明智的使用运算符重载能令我们的程序更易于编写和阅读。
一、基本概念
- 什么是运算符重载?
重载的运算符是具有特殊名字的函数:它们的名字由关键字 operator 和其后要定义的运算符共同组成。 - 重载运算符的方式有哪些?
一般可以通过类成员函数、友元函数或者是类外的普通函数重载运算符。
二、规则
- 不能重载的运算符有:. .* :: 和 sizeof
- 友元函数和成员函数的使用场合:
一般情况下,建议一元运算符元使用成员函数重载,二元运算符使用友元函数重载
a. 运算符的操作需要修改类对象的状态,则使用成员函数。比如需要做左值操作数的运算符(=, +=, -=)
b. 运算时,有数和对象的混合运算时,必须使用友元函数
c. 二元运算符中,第一个操作数位非对象时,必须使用友元函数。如 << 和 >>
具体规则见下表:
| 运算符 | 建议使用 |
| 所有一元运算符 | 成员函数 |
| = () [] -> | 必须是成员函数 |
| += -= /= *= ^= &= != %= >>= <<= | 成员函数 |
| 所有其他的二元运算符 | 友元函数 |
| << >> | 必须友元函数 |
三、注意
- 一般情况下(除了函数调用操作符),重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符来说,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数。
- 除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。
- 当一个重载的运算符是成员函数时,this 绑定到左侧运算对象。所以成员运算符函数的(显式)参数数量比运算对象的数量少一个。
- 对于一个运算函数来说,它或者是类的成员,或者至少含有一个类类型的参数:
//错误:不能为int重定义内置的运算符
int operator+(int ,int);
C++重载运算符简单总结的更多相关文章
- C++ 重载运算符简单举例
我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...
- 简单重载运算符in priority_queue By cellur925
我们都知道priority_queue是大根堆. 一.变成小根堆 法一:把元素的相反数丢进堆中 法二 priority_queue<int,vector<int>,greater&l ...
- 【STL】重载运算符
重载运算符 为什么要重载运算符: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如结构体),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予 ...
- C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...
- C++学习之重载运算符1
C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 #include<iostream> using namespace std; cla ...
- C++结构体:默认构造函数,复制构造函数,重载=运算符
C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就 ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- Python 正确重载运算符
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 有些事情让我不安,比如运算符重载.我决定不支持运算符重载,这完全是个人 ...
- 【noi 2.6_9290】&【poj 2680】Computer Transformation(DP+高精度+重载运算符)
题意:给一个初始值1,每步操作将1替换为01,将0替换为10.问N步操作后有多少对连续的0. 解法:f[i]表示第i步后的答案.可以直接打表发现规律--奇数步后,f[i]=f[i-1]*2-1;偶数步 ...
随机推荐
- JavaScript中的 函数splice() 的使用。
大二接触JavaScript初期,学习函数中有一道题: 定义一个2个参数的函数.第1个参数是一个数组,第2个参数是需要删除的元素.函数功能,在第1个实参数组中查找第2个实参提供的值,找到则删除该元素( ...
- 开发日记(项目中SQL查询的优化)
今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME) ...
- (转)分布式文件存储FastDFS(六)FastDFS多节点配置
http://blog.csdn.net/xingjiarong/article/details/50759918 前面几篇关于FastDFS的博客中介绍了如何在一台机器上搭建一个简易的FastDFS ...
- 聊聊JS动画库:Velocity.js
前言 又到了炎热的7月,很久没有更新技术文章了,原因是上月月底实习结束,从公司离职.然后最近在弄自己的项目和考驾照,为了下次公司的应聘做准备,送别了女朋友到外地,哩哩啦啦半个月把一切事情都办妥后,还是 ...
- MySQL操作数据库和表的基本语句(DDL
1.创建数据库: CREATE DATABASE 数据库名; eg.CREATE DATABASE test_ddl;122.创建表 CREATE TABLE 表名(列名 数据类型 约束,...); ...
- 用 foreach()循环三维数组
<?php $data = array( 0 => array( '中国' => 'china', '美国' => 'usa', '德国' => ' Germany', ...
- SOUI界面库 添加 windows系统文件图标皮肤
最近在学习soui界面库.其中有用到SListCtrl这个控件来现在文件信息.控件用法基本上和mfc 的CListCtrl差不多.也支持图标显示.但是图标是要自己加入图标图片的.这个就有点不好弄.于是 ...
- 3.git高级篇总结
阅读 Git 原理详解及实用指南 记录 高级 1:不喜欢merge的分叉,用rebase吧 介绍的是 rebase 指令,它可以改变 commit 序列的基础点.它的使用方式很简单: git reba ...
- Django-cookie与session操作
添加cookie: def login(req): if req.method=="POST": uf = UserInfoForm(req.POST) if uf.is_vali ...
- Git:分支的创建、合并、管理和删除
了解分支 如果想实现多人协作.划出Bug区.Feature区等功能,就需要分支功能.(确实很强大的地方) 每次commit时,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条 ...