博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 运算符重载
阅读量:6423 次
发布时间:2019-06-23

本文共 2986 字,大约阅读时间需要 9 分钟。

1、 operator =

const Array& operator = ( const Array& rhs);
返回值不为void是考虑到需要支持a=b=c;这种情况
前面的const是考虑到(a=b)=c;这种情况时,应该报错

由编译器自动创建的函数包括:默认的构造函数、拷贝构造函数、operator = 、析构函数

2、 operator <<

operator >> 必须写成友元函数
原因是<<运算符的函数签名是 ostream& operator<<(ostream&, your_class&) 这里第一个参数是ostream类型,你不可能修改ostream类型的定义,因此你不可
能将它定义成ostream类的成员函数。你必须把它定义成一个普通的函数,如果这个函数需要拿到your_class的私有成员,那么你就把这个函数在your_class内部声
明为friend

friend ostream& operator<<(ostream& outStream,const Rational& rhs);    friend istream& operator>>(istream& inStream,Rational& rhs);

输入函数最后的参数不能为const;

3、必须重载为成员函数的运算符: [], (), –>, =

原因是这些运算符左边必须是这个类的变量(或者是子类的)。

4 自动类型转换

4.1 自动类型转换-构造函数转换

class One    {    public:        One(){}    };    class Two    {    public:        Two(const One&){}   // here!    };    void f(Two){}    int main()    {        One one;        f(one);    }

为避免构造函数自动转换可能引起的问题,可以在前面加 explicit 关键字

class One    {    public:        One(){}    };    class Two    {    public:        explicit Two(const One&){}    };    void f(Two){}    int main()    {        One one;        // ! f(one); //不行了        f(Two(one));    }

 

4.2 自动类型转换-运算符转换

class Three    {        int i;    public:        Three(int ii=0,int=0): i(ii){}    };    class Four    {        int x;    public:        Four(int xx): x(xx){}        operator Three() const { return Three(x); } // here!    };    void g(Three) {}    int main()    {        Four four(1);        g(four);        g(1);    // CALL Three(1,0);    }

注意:使用构造函数技术没有办法实现从用户定义类型向内置类型转换,这只有运算符重载可能做到

4.3 自动类型转换的缺陷
4.3.1

class Orange;    class Apple    {    public:        operator Orange() const;    };    class Orange    {    public:        Orange(Apple);    };    void f(Orange);    int main()    {        Apple a;        f(a);    }

当两种类型的转换同时存在时,编译器不知道应该执行哪一个

4.3.

class Orange{};    class Pear{};    class Apple    {        operator Orange() const;        operator Pear() const;    };    void eat(Orange);    void eat(Pear);    int main()    {        Apple c;        eat(c);    // Error: Apple->Orange or Apple->Pear???    }

当类中有多个向其他类型的转换时,它们不应该是自动转换,而应该是用如makeA()和makeB()这样的名字来创建显式的函数调用

5、 operator() 实现回调,下面是CEGUI中实现时间回调的一个雏形:

class EventArgs    {    public:        // construction        EventArgs(): d_handled(false),d_hasWindow(false):{}        // data members        bool d_handled;        bool d_hasWindow;    };    class FuctionSlotBase    {        virtual ~FuctionSlotBase(){}        virtual operator()(const EventArgs& args) = 0;    };    template
class MemberFunctionSlot: public FuctionSlotBase { public: typedef bool(T::*MemberFunctionType)(const EventArgs&); MemberFunctionSlot(MemberFunctionType func, T* obj): d_function(func), d_object(obj) {} virtual bool operator(const EventArgs& args) { return (d_object->*d_function)(args); } private: MemberFunctionSlot d_function; T* d_object; };

转载于:https://www.cnblogs.com/luleigreat/archive/2012/07/07/2580800.html

你可能感兴趣的文章
Load Balance 产品横向比较
查看>>
Java代理程序实现web方式管理邮件组成员
查看>>
【编译打包】tengine 1.5.1 SRPM
查看>>
看图说话:手动清除病毒文件流程
查看>>
一句话下拖库
查看>>
Deploy Office Communications Server 2007R2 Group Chat Server(二)
查看>>
在Cacti上实现MSN报警机制
查看>>
如何对C++虚基类构造函数
查看>>
XFire WebService开发快速起步
查看>>
JavaScript 函数replace揭秘
查看>>
QTP解决内嵌IE窗体方法2
查看>>
“王子”的演讲:N828印象
查看>>
判断JS字符串中是否包含某些字符
查看>>
Phalanger---PHP的.NET编译器
查看>>
Scanner----java控制台和文件读取的利器(java 5新增)
查看>>
怎样解决spoolsv.exe应用程序错误
查看>>
Android应用程序键盘(Keyboard)消息处理机制分析(25)
查看>>
如何安全设定和检测你的密码安全性?
查看>>
一例HP ADG数据恢复成功(8×73GB SCSI)
查看>>
虚拟化系列-Citrix XenServer 6.1 XenMotion与HA
查看>>