CSC270 November 18 Tutorial: C++


Operators

An operator is one of: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete In C++, these can be redefined to operate on members of a class. An operator can be written as a function call. The following two assignments are equivalent: Complex a,b,c; a = b + c; a = b.operator+(c); In this case, operator+ is a function defined in Complex, like class Complex { private: float real, imag; public: // the constructors (which one is used depend upon the arguments) Complex() { real = 0; imag = 0; } Complex( float re, float im ) { real = re; imag = im; } // addition of complex numbers Complex operator+( Complex x ) { return Complex( real+x.real, imag+x.imag ); } }; Above, the function operator+ returns a new Complex using the Complex() constructor. For BINARY operators, like +, -, *, /, the first argument (a in a+b) is always implicit. Above, the first argument is the class instance in which the function is executing, so "real" and "imag" are components of the first argument. The second argument (b in a+b) is passed as a parameter, so "x.real" and "x.imag" are components of the second argument. It's a bit confusing. For UNARY operators, like &, -, !, the only argument is implicit: typedef enum {TRUE,FALSE} bool_type; class Boolean { private: bool_type b; public: Boolean( bool_type bool_val ) { b = bool_val; } Boolean() { b = FALSE; } Boolean operator!() { if (b == TRUE) return Boolean( FALSE ); else return Boolean( TRUE ); } }; This would be used as follows: Boolean a, b; a = TRUE; b = !a;

Defining the output operator "<<" for your class

The output operator << can be defined for your class. The following code does so for the Boolean class. This code should appear *inside* the class definition, in the public part. friend ostream& operator<< ( ostream& o, Boolean& boolean ) { if (boolean.b == TRUE) o << "TRUE"; else o << "FALSE"; return o; } The operator << takes an output stream and a class instance as arguments and returns the output stream (more on this below). Inside the function, stuff is sent to the output stream. In this case, the stuff is either the character string "TRUE" or the character string "FALSE". Note that there's not a newline "\n" at the end. If the programmer wants a newline, he or she will put it in explicitly where the code uses the operator <<. If operator<< is declared as a "friend" inside the Boolean class definition, it will have access to all the components of the class. This important, since operator<< is an *independent* function that shouldn't be associated with any particular class. The reason for returning the output stream is a bit esoteric: it allows us to string together many outputs in one statement: cout << a << b; This is really parsed as (cout << a) << b; so b is being sent to the stream (cout << a), which is the value returned by the call to operator<<( cout, a ) which is cout. It's a bit convoluted. You just have to use the template shown above and remember to return the stream.