• 前缀++与后缀++的重载


    4.2 Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
    不论是 increment 或 decrement 的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++
    规定后缀形式有一个 int 类型参数,当函数被调用时,编译器传递一个 0 做为 int 参数的值
    给该函数

      1 #include <iostream>
      2 
      3 class UInt{
      4 public:
      5     explicit UInt(int i = 0) : m_int(i) { }
      6     ~UInt() { }
      7     UInt(const UInt &rhs) : m_int(rhs.get()) { }
      8 
      9 public:
     10     UInt &operator=(const UInt &rhs);
     11 
     12     //前缀形式返回一个引用,是一个左值
     13     //后缀形式返回一个const类型,是一个右值,亦即是不能被赋值
     14     UInt &operator++();
     15     const UInt operator++(int);
     16     UInt &operator--();
     17     const UInt operator--(int);
     18     UInt& operator+=(int);
     19     int get(void) const { return m_int; }
     20     void set(int i) { m_int = i; }
     21 private:
     22     int m_int;
     23 };
     24 
     25 UInt operator +(const UInt &lhs, const UInt &rhs)
     26 {
     27     UInt result;
     28 
     29     result.set(lhs.get() + rhs.get());
     30 
     31     return result;
     32 }
     33 
     34 UInt& UInt::operator =(const UInt &rhs)
     35 {
     36     m_int = rhs.get();
     37 
     38     return *this;
     39 }
     40 
     41 //返回一个自身的引用,没有临时对象的代价,性能较高
     42 UInt& UInt::operator ++()
     43 {
     44     *this += 1;
     45 
     46     return *this;
     47 }
     48 
     49 //返回一个临时对象,增加了一个对象构造和析构的代价,性能较低
     50 //由此可见,对于用户自定义类型,应该尽量使用前缀的increment
     51 const UInt UInt::operator ++(int)
     52 {
     53     UInt oldVal = *this;
     54 
     55     ++(*this);
     56 
     57     return oldVal;
     58 }
     59 
     60 UInt& UInt::operator --()
     61 {
     62     *this += (-1);
     63     
     64     return *this;
     65 }
     66 
     67 const UInt UInt::operator --(int)
     68 {
     69     UInt oldVal = *this;
     70 
     71     --(*this);
     72 
     73     return oldVal;
     74 }
     75 
     76 UInt& UInt::operator +=(int val)
     77 {
     78     m_int += val;
     79 
     80     return *this;
     81 }
     82 
     83 int main(void)
     84 {
     85     std::cout << "Hello World!" << std::endl;
     86 
     87     UInt u1(2);
     88     UInt u2(2);
     89 
     90     //Output 2
     91     std::cout << "u1++ return " << (u1++).get() << std::endl;
     92     //Output 3
     93     std::cout << "++u2 return " << (++u2).get() << std::endl;
     94 
     95     //Output 3
     96     std::cout << u1.get() << std::endl;
     97     //Output 3
     98     std::cout << u2.get() << std::endl;
     99 
    100     return 0;
    101 }
  • 相关阅读:
    android 网络请求Volley的简单使用
    数据加密,android客户端和服务器端可共用
    非常有用的GitHub链接
    android开发——Android开发中的47个小知识
    EditText禁用系统键盘,光标可以继续使用
    Android Studio 快速开发
    Android系统拍照之后回显并且获取文件路径
    Android为TV端助力 doc里面adb连接出现问题的解决方法
    Android为TV端助力 自定义view中findViewById为空的解决办法
    Android为TV端助力 VelocityTracker 速度追踪器的使用及创建
  • 原文地址:https://www.cnblogs.com/jojodru/p/2846476.html
Copyright © 2020-2023  润新知