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
原创粉丝点击