zoukankan      html  css  js  c++  java
  • 隐式类型转换 与 隐式类型转换操作符

    1、考虑下面的情况:有个Person类,内部有个age字段。正常情况下,定义和赋值为:

    Person p = Person(8);

    p = Person(9);

    但是有个家伙很懒,他想这么写:

    Person p = 8;

    p =9;

    这样写也是可以的,因为编译器知道你的意图,运行的时候会进行一次隐式类型转换,中间适配一个临时对象。这就是隐式类型转换,但这样写不好,因为语义不通。要避免这种情况,使用explicit,这样编译器就会曝出错误。

    2、现在在考虑下面的需求:判断p的年龄是否大于5,正常的写法是:

    if(p.GetAge()>5){....}

    但是,上面的家伙还是很懒,想直接这样写:

    if(p>5){....}

    这是情况,有两种解决办法,一种是让p转化为对应的age,一种是让5转化为Person。

    a、前一种办法,使用隐式类型转换操作符 operator int()

      这时候,需要提供一个隐式类型转换操作符,

      Person::operator int()
      {
         return this->age;
      }

    b、后一种办法,提供一个操作符重载,如下:

      bool operator>(const Person& lhs,const Person& rhs)
      {
         return lhs.GetAge()>rhs.GetAge();
      }

    注意:如果两种方法同时提供,编译器会报错,因为编译器不知道应该使用哪一个类型转换。


    补充说明:操作符重载,本质上是方法,和GetName一样,operator+ 对应于方法名。而隐式类型转换操作符可以认为是一个特殊的成员方法,这个成员方法为operator int(),可以认为这个方法以operator开头,返回值是int,没有方法名,没有形参。

  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3421932.html
Copyright © 2011-2022 走看看