C++运算符重载学习的好例子(thinking in c++)

//:UNARY.CPP -- Overloading unary operators
#include <iostream>
using namespace std;
class integer {
 long i;
 integer*  This() { return this; }
public:
 integer (long I = 0):i(I) {}
 //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& agrument
 //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 operator:
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 iecrement;
const integer operator++(integer& a,int) {
 cout << "integer++/n";
 integer r(a.i);
 a.i++;
 return r;
}
//Prefix; return incremented value
const integer& operator--(integer& a) {
 cout << "--integer/n";
 a.i--;
 return a;
}
//Postfix:return the value before iecrement;
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--;
}
//Menber operators (implicit "this "):
class byte {
 unsigned char b;
public:
 byte (unsigned char B = 0) : b(B) {}
 //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);
}

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值