C++对运算符进行重载学习笔记
1. 一个类的成员函数是暗含着 this 指针的,eg;
#include<iostream>
using namespace std; class A{
public:
A(){ x = ;}
double get_add(A &c);
private:
double x;
}; double A::get_add(A &c){
A d;
return d.x = x+c.x; //注意这里的 x+c.x;这个单独的 x 相当于 this->x 或者 (*this).x;
}
2. 将运算符重载函数作为类的友元函数和作为类的成员函数的区别:
如果将运算符重载函数作为类的成员函数,它可以通过 this 指针自由地访问本类的数据成员,因此可以少写一个函数的参数。但是,必须要求运算表达式(如c1+c2)左侧第一个参数是一个类的对 象,而且欲运算符函数的类型相同。
在进行运算符重载的时候,考虑到各方面的因素和程序员的习惯,以下仅供参考:
(1) C++规定,赋值运算符=、下标运算符[ ] 、函数调用运算符() 、成员运算符 ->必须作为成员函数。
(2)流插入<< 和 流提取运算符 >> 、类型转寒运算符不能定义为类的成员函数,只能作为友元函数。
(3)一般将单目运算符和复合运算符(+= , -= , /= ,*= , &=, !=,`= ,%= ,>>= ,<<=)重载为成员函数。
(4)一般将双目运算符重载为友元函数。
运算符重载的声明方式:
1.重载单目运算符:
1.1 成员函数:
类中声明: Complex Complex::operator+(Complex &c2); //一个参数,另一个是暗含的this指针。
类外定义: Complex Complex::operator+(Complex &c2){};
1.2 友元函数:
类中声明:friend Complex operator+(Complex &C1,Complex &c2); //注意有两个参数了
类外定义:Complex operator+(Complex &C1,Complex &c2){};
2.重载双目运算符 “==” “>” “<”
类中声明:friend bool operator==(Complex &c1,Complex &c2);
类外定义:bool operator==(Complex &c1,Complex &c2){};
大于和小于的情况只需要把“==”替换一下就行。
3. 重载单目运算符 "++" "--":
由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可以省略此参数。
C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。
贴个代码吧,练练手。
#include<iostream>
using namespace std; class Time{
public:
Time(){minute = ;sec = ;}
Time(int m,int s):minute(m),sec(s){}
Time operator++();
Time operator++(int);
void display(){cout<<minute<<":"<<sec<<endl;}
private:
int minute;
int sec;
}; Time Time::operator++() //定义前置自增运算符"++"重载函数
{
if(++sec>=)
{
sec -= ;
++minute;
}
return *this; //返回自增加后的当前对象;
} Time Time::operator++(int) //定义后置自增运算符"++"重载函数
{
Time temp(*this); //创建临时对象temp;
sec++;
if(sec>=)
{
sec -= ;
++minute;
}
return temp; //返回的是自增前的对象;
} int main()
{
Time time1(,),time2;
cout<<"time:";
time1.display();
++time1;
cout<<"++time1:";
time1.display();
time2 = time1++;
cout<<"time++";
time1.display();
cout<<"time2:";
time2.display();
return ;
}
/*
运行结果:
time:34:59
++time1:35:0
time++35:1
time2:35:0
*/
程序分析:重载后置资政运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用,在定义函数时也不必使用此参数,因此可省写参数名,只须在括号中写int即可。
4. 重载流插入运算符和流提取运算符:
形式:
istream & operator>>(istream &,自定义类 &);
ostream & operator<<(ostream &,自定义类 &);
C++对运算符进行重载学习笔记的更多相关文章
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...
- 初探C++运算符重载学习笔记<2> 重载为友元函数
初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...
- EL运算符(web基础学习笔记十七)
一.EL语法 1.1.语法结构 ${expression} 1.2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一 ...
- JavaScript权威设计--JavaScript表达式与运算符,语句(简要学习笔记六)
1.delete是一元操作符,用来删除对象属性或者元素. var a={ x:1, y:2 } delete a.x; //删除x属性 “x”in a //false:a对象中已经不存在x属性 ale ...
- C++学习笔记之运算符重载
一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- C++学习笔记(5)----重载自增自减运算符
自增运算符“++”和自减运算符“--”分别包含两个版本.即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的.因此,当我们在对这两个运算符进行重载时,就必须区分前置 ...
随机推荐
- ZT 二叉树的非递归遍历
ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...
- 【转】说说Android中的style和theme
最近在做软件从2.3到4.0的改变的一些工作,其中涉及了一些style和theme相关的东西.上网上查了一些东西,这个一并说说.关于android中style和theme的基本使用,这里就不再赘述了, ...
- 20155314 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉(macOS + IDEA)
20155314 2016-2017-2 <Java程序设计>实验一 Java开发环境的熟悉(macOS + IDEA) 实验内容 使用JDK编译.运行简单的Java程序: 使用IDEA ...
- sqlmap参数
sqlmap -u “http://url/news?id=1" –current-user #获取当前用户名称sqlmap -u “http://www.xxoo.com/news?id= ...
- js之radio应用实例
radio和checkbox还有select,可谓是前后端常用三剑客啊!特别是checkbox和select,关于这两个今天不讲,因为在下面这几篇文章,我已经比较详细的讲解了. SpringMVC之a ...
- JDBC通过配置文件(properites)读取数据库配置信息
扫盲: Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM( ...
- webpack超详细配置, 使用教程(图文)
流程 webpack安装 Step 1: 首先安装Node.js, 可以去Node.js官网下载. Step2: 在Git或者cmd中输入下面这段代码, 通过全局先将webpack指令安装进电脑中np ...
- 【题解】洛谷P1070 道路游戏(线性DP)
次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...
- STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式
已经实现 ,2018年11月17日11:56:42,具体 如下: 第一步 : 修改 void vPortSetupTimerInterrupt( void ) 函数 ,修改原来的 systick 定 ...
- Hadoop应用开发,常见错误
错误1:在windows执行mr Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.had ...