[Investor Relations]  |  官方微博

C/C++培训

美国上市公司 · 亿元级外企Java培训企业

  • 全国服务监督电话400-111-8989
C++培训 > 学习笔记 > C++之双目/单目等运算符的重载
  • C++之双目/单目等运算符的重载

    发布:达内  来源:达内  时间: 2015年01月14日

  • C++之双目/单目等运算符的重载...

  • 1. 双目运算符重载

    1.1格式:

    L/*左操作数*/ # /*操作符*/ R/*右操作数*/

    L#R

    => L.operator#(R) 成员形式,写在类中,成员函数形式

    => operator#(L,R) 非成员形式 //需要定义为类的友元函数

    如:

    cout 《 c1;

    => cout.operator《(c1)

    => operator《(cout,c1)

    1.2实际操作形式:

    类名 operator+(const 类名& 对象名)

    { return 类名(…,…);//构建的一个匿名对象}

    类名 operator-(const 类名& 对象名)

    { return 类名(…,…);//构建的一个匿名对象}

    类名& operator+=(const 类名& 对象名)

    { return *this = *this + 对象名;}

    类名& operator-=(const 类名& 对象名)

    { return *this -= *this - 对象名;}

    2. 单目运算符的重载

    2.1格式:

    #/*操作符*/O/*操作数*/

    =>O.operator#();//成员形式

    =>operator#(O); //非成员形式

    如:

    cout 《 -c1 《 endl;

    c1.operator-();//成员函数形式

    operator-(c1);//非成员函数形式

    2.2实际操作形式:

    类名 operator-(void)

    { return 类名(-…,-…);}

    注意:

    对于运算符重载的两种形式中,优先调用成员函数形式

    3.关于自增自减运算符的使用:

    (1) 前缀自增自减运算符

    a.表达式的值是增减以后的值

    b.运算函数返回的是操作数的引用

    c.成员函数形式的运算符函数没有参数,友元函数形式的运算符函数只有一个参数:操作数

    d.可以连用

    class A

    { A& operator++(){  ++m_r;++m_i;return *this;}};//成员函数形式

    A& operator(A& a)//友元函数形式

    {

    ++m_r;++m_i;

    return a;

    }

    注意:加引用就是为了连续使用;

    (2) 后缀自增自减运算符

    a.表达式的值是增减以前的值

    b.运算函数返回的是操作数增减以前的副本

    c.成员函数形式的运算符函数有int类型的哑元参数,友元函数形式的运算符函数有两个参数:操作数  和 哑元

    d.不可以连用

    class A

    { const A operator++(int){return(m_r++,m_i++);}};//成员函数形式

    const A operator++(A& a,int)//友元函数形式

    { return A(a.m_r++,a.m_i++);}

    注意:加const就是为了防止连续运算

    4. 类型转换运算符函数

    4.1格式:

    在源类型中定义如下形式的运算符函数

    operator 目标类型(void)

    {

    构造一个目标类型的对象返回(目标类型也可以是基本数据类型)

    }

    功能:

    将一个类的对象转换成另一个类型的数据,该函数没有返回值类型;

    注意:

    如果在源类型中提供类型转换运算符函数的同时,在目标类型中定义支持类型转换的构造函数,对于隐式类型转换,系统会优先选择类型转换运算符函数 完成转换,而对于显式类型转换,系统优先选择构造函数(建议只提供构造函数即可,因为可以使用explicit 关键字修饰构造函数,表示该构造函数只能用于显示类型转换,从而防止潜在的错误;)

    扩展:

    如果一个类类型对象和一个基本数据类型运算时,怎么处理?

    Complex c(2,3);

    cout 《 "c + 100 " 《 c + 100 《 endl;//c.operator+(100);

    5.不允许用户重载的运算符

    ::作用域解析操作符

    . 成员访问操作符

    .* 成员指针解引用

    : 三目运算符

    sizeof  字节长度运算符

    typeid  类型信息操作符
    注意:

    (1)操作符的操作数中没有类类型的操作数时,不能重载

    (2)不能通过运算符重载去发明新的操作符,比如:**

    6.只能定义为成员函数的运算符

    (1)下标操作符[] (见代码xibiao.cpp)//

    //支持下标运算符的重载

    int operator[](int n)

    { return m_data[n];}

    (2)函数操作符() (见代码funOperator.cpp)//

    class Square

    {public://支持()运算符重载

    int operator()(int n)

    {return n*n;}};

    (3)间接操作符*,->  (见代码 jianjie.cpp)//智能指针类

    //智能指针类

    class PA

    {private:A* m_pa;

    public:PA(A* pa):m_pa(pa){}

    ~PA(void)

    {delete m_pa;m_pa = NULL;}

    //支持->运算符函数

    A* operator->(void)

    {return m_pa;}

    //支持*运算符重载

    A& operator*(void)

    { return *m_pa;}};

    7.new / delete 运算符的重载

    应用:

    一般把构造函数调用之前的初始化工作放在new运算符的重载函数中

    一般把析构函数调用之后的善后工作放在delete运算符的重载函数中

    例子://new []运算符进行重载

    static void* operator new[](size_t size)

    {void* p = malloc(size);cout 《 "我自己的New[]:size = " 《 size 《 ",p = " 《 p 《 endl;return p;}

    // delete[] 运算符重载

    static void operator delete[](void* p)

    {cout 《 "我自己的delete[]:p = " 《 p 《 endl;free(p);}

  • 上一篇:C++培训:strcpy函数导致release版程序崩溃

    下一篇:C++的那些事:类的拷贝控制

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56