Namespaces and Operator overloading
Namespaces
Problem:
// A.h class foo { … }; // B.h class foo { … }; // use.cpp #include “A.h” #include “B.h” // Clash of class definitions!
Solution:
// A.h namespace A { // Global scoping class foo { … }; } // B.h namespace B { // Global scoping class foo { … }; } // use.cpp #include “A” // No suffix “.h” when the header contains a namespace #include “B” // No clash! A::foo objectFoo1; B::foo objectFoo2;
Operator overloading
(x + y) is equivalent to
x.operator+(y) // Member function
OR
operator+(x,y) // Non-member function
Chaining of operators is also possible:
x + y + z
is equivalent to
((x + y) + z)
OR
(x.operator+(y)).operator+(z)
Signature:
A operator+(const A& other);
Assignment operator:
x = y = z
is equivalent to:
x = (y = z)
OR
x.operator=(y.operator=(z))
Signature:
A& operator=(const A& other);
Standard input:
std::cin >> x >> y
is equivalent to:
operator>>(operator>>(std::cin, x), y)
Signature (must be a non-member function):
std::istream& operator>>(std::istream& s, A& a)
Standard output:
std::cout << x << y
is equivalent to
operator<<(operator<<(std::cout, x), y)
Signature (must be a non-member function):
std::ostream& operator<<(std::ostream& s, const A& a);
Prefix/postfix operators:
++x is equivalent to
x.operator++()
x++ is equivalent to
x.operator++(0) // 0 is irrelevant but used for function overloading
++(++x) is equivalent to
x.operator++().operator++()
(x++)++ is NOT legal.
A& operator++() // Prefix { // Increment logic return *this; } A operator++(int) // Postfix { A result(*this); // Copy constructor called ++(*this); // Prefix operator function invoked return result; }
Subscripting:
A a; MemberType m; a[i] = m; // equivalent to a.operator[](i) = m const A a; a[i] = m; // illegal
Signatures:
const MemberType& operator[](int index) const; // Receiver is a const MemberType& operator[](int index); // Receiver is a not const