⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unary.cpp

📁 Think in C++ 第二版源码
💻 CPP
字号:
//: C12:Unary.cpp

// From Thinking in C++, 2nd Edition

// Available at http://www.BruceEckel.com

// (c) Bruce Eckel 1999

// Copyright notice in Copyright.txt

// Overloading unary operators

#include <iostream>

using namespace std;



class Integer {

  long i;

  Integer* This() { return this; }

public:

  Integer(long ll = 0) : i(ll) {}

  // No side effects takes const& argument:

  friend const Integer&

    operator+(const Integer& a);

  friend const Integer

    operator-(const Integer& a);

  friend const Integer

    operator~(const Integer& a);

  friend Integer*

    operator&(Integer& a);

  friend int

    operator!(const Integer& a);

  // Side effects don't take const& argument:

  // Prefix:

  friend const Integer&

    operator++(Integer& a);

  // Postfix:

  friend const Integer

    operator++(Integer& a, int);

  // Prefix:

  friend const Integer&

    operator--(Integer& a);

  // Postfix:

  friend const Integer

    operator--(Integer& a, int);

};



// Global operators:

const Integer& operator+(const Integer& a) {

  cout << "+Integer\n";

  return a; // Unary + has no effect

}

const Integer operator-(const Integer& a) {

  cout << "-Integer\n";

  return Integer(-a.i);

}

const Integer operator~(const Integer& a) {

  cout << "~Integer\n";

  return Integer(~a.i);

}

Integer* operator&(Integer& a) {

  cout << "&Integer\n";

  return a.This(); // &a is recursive!

}

int operator!(const Integer& a) {

  cout << "!Integer\n";

  return !a.i;

}

// Prefix; return incremented value

const Integer& operator++(Integer& a) {

  cout << "++Integer\n";

  a.i++;

  return a;

}

// Postfix; return the value before increment:

const Integer operator++(Integer& a, int) {

  cout << "Integer++\n";

  Integer r(a.i);

  a.i++;

  return r;

}

// Prefix; return decremented value

const Integer& operator--(Integer& a) {

  cout << "--Integer\n";

  a.i--;

  return a;

}

// Postfix; return the value before decrement:

const Integer operator--(Integer& a, int) {

  cout << "Integer--\n";

  Integer r(a.i);

  a.i--;

  return r;

}



void f(Integer a) {

  +a;

  -a;

  ~a;

  Integer* ip = &a;

  !a;

  ++a;

  a++;

  --a;

  a--;

}



// Member operators (implicit "this"):

class Byte {

  unsigned char b;

public:

  Byte(unsigned char bb = 0) : b(bb) {}

  // No side effects: const member function:

  const Byte& operator+() const {

    cout << "+Byte\n";

    return *this;

  }

  const Byte operator-() const {

    cout << "-Byte\n";

    return Byte(-b);

  }

  const Byte operator~() const {

    cout << "~Byte\n";

    return Byte(~b);

  }

  Byte operator!() const {

    cout << "!Byte\n";

    return Byte(!b);

  }

  Byte* operator&() {

    cout << "&Byte\n";

    return this;

  }

  // Side effects: non-const member function:

  const Byte& operator++() { // Prefix

    cout << "++Byte\n";

    b++;

    return *this;

  }

  const Byte operator++(int) { // Postfix

    cout << "Byte++\n";

    Byte before(b);

    b++;

    return before;

  }

  const Byte& operator--() { // Prefix

    cout << "--Byte\n";

    --b;

    return *this;

  }

  const Byte operator--(int) { // Postfix

    cout << "Byte--\n";

    Byte before(b);

    --b;

    return before;

  }

};



void g(Byte b) {

  +b;

  -b;

  ~b;

  Byte* bp = &b;

  !b;

  ++b;

  b++;

  --b;

  b--;

}



int main() {

  Integer a;

  f(a);

  Byte b;

  g(b);

} ///:~

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -