//: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);
}