课程咨询 :025-84640158

  • 南京C++培训:C++之双目/单目等运算符的重载

    发布:南京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++培训:类的拷贝控制

下一篇:没有下一篇了

最新开班日期  |  更多

c++--零基础全日制班

c++--零基础全日制班

开班日期:04-28

c++--零基础周末班

c++--零基础周末班

开班日期:04-28

c++--高薪就业班

c++--高薪就业班

开班日期:04-28

c++--免费训练营

c++--免费训练营

开班日期:04-28

  • 地址:南京市玄武区洪武北路121号苏苑大厦5楼
  • 课程培训电话:025-84640158     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2002-2018 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56