C++学习笔记(九)

操作符重载、友元函数、类的强制转换

 

1.将某个函数改为重载操作符的函数只要将函数名替换为operator+()即可

   如:Time Sum(const Time & t)const

   改为Time operator+(const Time & t)const

  调用时可以如 total = coding.operator+(fixing);     //coding是Time类的一个对象

   也可以调用如: total = coding+fixing;

  两种方法都将调用operator+()方法,其中,操作符左侧的对象时调用对象,右侧的对象时作为参数被传递的对象。

  因此t4 = t1 + t2 + t3 会被转化为 t4= t1.operator+(t2.operator+(t3)};

当被重载的操作符为非成员重载操作符时,应使用非成员函数进行重载,例如:

  A = 2.75*B   //此种由于2.75为double,因此不是类成员,从而不能用成员函数重载后的操作符进行调用。

它与下面的非成员函数调用匹配:

  A= operator*(2.75,B);            //等价于Time operator *(double m,const Time & t);

  非成员函数重载时,操作符表达式左边的操作数对应于操作符函数的第一个参数,操作符表达式右边的操作数对应第二个参数。

2.非成员函数访问类的私有成员时可以借助友元,即能访问类的私有成员的非成员函数叫做友元函数。

  友元函数声明中带friend但定义中不带,且友元函数前不能加类的限定符,因为是非成员函数

3.一种<<操作符的重载(使用cout<<...直接输出对象内容)

      (1)   void  operator<<(ostream &os,const Time &t)   //Time类有两个成员变量hours和minutes

                {

                            os<<t.hours<<"hours."<<t.minutes<<"minutes";

                }

     (2)为了支持操作cout<<A<<B;  这种连续输出,左侧表达式(cout<<A)应返回一个ostream类型对象以此来调用下一次的输出操作。此时由于程序传入的参数是一个对象的引用,因此返回参数时应返回该对象的引用,即返回为ostream &型。如下:

          ostream & operator<<(ostream &os,const Time &t)

         {

                    os<<...;

                    return os;                              //该种重载还可以用于文件fou<<的重载(直接输出某文件)

         }

4.只接受一个参数的构造函数可以用于将参数转换为类类型,这种是种隐式转换,如:

    定义时:Stonewt::Stonewt(double lbs)

                   {

                                stone = int(lbs) / x;                      //对double进行操作,构造函数返回Stonewt的类类型

                                   ...

                    }

    调用时:

    Stonewt myCat;

    myCat =19.6;                              //隐式转换

    如果在定义时使用关键字explicit,可以避免这种隐式转换,如: explicit Stonewt(double lbs);

    在用explicit限定完之后,如果想调用转换,则只能对它进行限制调用,如mycat=(Stonewt)19.6;    //强制转换属于显示调用

5.如果希望将类转化为已有类型,如int或double,需要创建转换函数,比如要转换为typeName类型,则要用如下形式:

   operator typename();

   比如讲某个类转化为Int型,则要将如下语句添加到类中:

   class Stonewt

  {

           ...

          operator int();                //也可以在后面加上const 限定符修饰

  }

     调用时直接 cout<<int(poppins)<<endl;      //此时假定poppins是Stonewt的一个对象

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值