c++学习笔记(九):运算符重载进阶
来源:互联网 发布:使用sci hub 知乎 编辑:程序博客网 时间:2024/05/19 16:34
前面学过用友元关键字修饰全局函数来对运算符进行重载。
下面介绍用类的函数成员来进行函数重载:
class Complex{public:Complex(int a, int b){this->a = a;this->b = b;}void printCom(){cout<<a<<" + "<<b<<"i "<<endl;}//通过成员函数完成前置++Complex& operator++(){this->a++;this->b++;return *this;}//通过类成员函数完成后置++Complex operator++(int){Complex tmp = *this;this->a++;this->b++;return tmp;}private:int a;int b;};void Test1(){Complex c1(1, 2);//前置++ ++c1; c1.printCom();//后置++ c1++; c1.printCom();system("pause");}
注:1、前置++与后置++的返回值是不同的,前者需要先完成自加再取值,因此需要完成自加自后将自己返回(采用引用做返回值),后者需要先取值再加加,因此需要先定义一个临时变量缓存当前值,然后在对自身加加,最后返回的是临时变量即未自加之前的值。
2、前置++与后置++的函数参数也是不同的:前置++:Complex& operator++();后置++Complex operator++(int),为了区别前置和后置的,在后置里要加个占位符。
那什么情况下用带友元关键字的全局函数重载操作符?什么情况下用类的成员函数重载操作符呢?
先看个例子:
此声明语句放到上面类里面:
friend ostream& operator<<(ostream &out, Complex &c1);
<<运算符重载用友元关键字修饰的全局函数:
ostream& operator<<(ostream &out, Complex &c1){out<<c1.a<<" + "<<c1.b<<"i "<<endl;return out;}ostream是什么鬼??
为什么他要用友元函数重载呢?? 那你用类成员函数重载试试,你可以再ostream类里添加这个重载类成员函数吗?肯定不能因此这种情况乖乖用友元函数吧。
看看测试函数吧:
void Test2(){Complex c1(1, 2);int a = 10;char *p = "addddd";cout<<"a"<<a<<endl;cout<<"p"<<p<<endl;//Complex自定义类型 :a + bi cout<<c1;//不用类成员函数//因为你没有方法拿到cout这个类的源码//cout.operator<<(c1);//返回值用引用 支持链式编程cout<<c1<<"abcc";//函数返回值当左值,要求返回一个引用。//上式相当于:cout.operator<<(c1).operator<<("abcd");}
0 0
- c++学习笔记(九):运算符重载进阶
- C#学习笔记(九):运算符重载
- 【笔记-C++】 运算符重载
- 运算符重载 学习笔记
- 运算符重载学习笔记
- 【C++】【学习笔记】【025-027】运算符重载
- 【C++】学习笔记五十一——运算符重载
- C++(笔记)浅析运算符重载&实例
- C++(笔记)重载运算符简单合并操作
- 《Inside C#》笔记(十一) 运算符重载
- 运算符重载(c++)
- 学习C++——运算符重载
- C++primer学习:重载运算符(3)
- C++primer学习:重载运算符(4)
- C# 学习笔记(五) ++/--运算符重载的意义
- c++学习笔记(八):运算符重载的推演
- c#学习笔记(七)运算符重载
- C++学习笔记之运算符重载
- PPT基础与进阶
- ftp 上传 文件 下载文件
- 黑马程序员——Java 基础:静态
- 迅雷是怎么下载的
- 单次遍历,等概率随机选取问题
- c++学习笔记(九):运算符重载进阶
- 功能测试
- 各种排序算法稳定性的总结!!!
- Maven学习札记
- oVirt介绍及安装记录
- golang cpuprofile分析
- 【JAVA知识】HashTable和HashMap的区别,并简述Hashmap的实现原理
- 克鲁斯卡尔算法(kruskal)(并查集的简单应用)
- 在xcode中修改整个项目名