adding lecture 13 operators
This commit is contained in:
@@ -1,10 +1,8 @@
|
|||||||
# Announcements
|
# Lecture 13 --- Operators & Friends
|
||||||
|
|
||||||
# Lecture 14 --- Operators & Friends
|
|
||||||
|
|
||||||
- Operators as non-member functions, as member functions, and as friend functions.
|
- Operators as non-member functions, as member functions, and as friend functions.
|
||||||
|
|
||||||
## 14.1 Complex Numbers — A Brief Review
|
## 13.1 Complex Numbers — A Brief Review
|
||||||
|
|
||||||
- Complex numbers take the form z = a + bi, where i = √−1 and a and b are real. a is called the real part, b is called the imaginary part.
|
- Complex numbers take the form z = a + bi, where i = √−1 and a and b are real. a is called the real part, b is called the imaginary part.
|
||||||
- If w = c + di, then
|
- If w = c + di, then
|
||||||
@@ -13,7 +11,7 @@
|
|||||||
– w × z = (ac − bd) + (ad + bc)i
|
– w × z = (ac − bd) + (ad + bc)i
|
||||||
- The magnitude of a complex number is √a<sup>2</sup> + b<sup>2</sup>;
|
- The magnitude of a complex number is √a<sup>2</sup> + b<sup>2</sup>;
|
||||||
|
|
||||||
## 14.2 Complex Class declaration ([complex.h](complex.h))
|
## 13.2 Complex Class declaration ([complex.h](complex.h))
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
class Complex {
|
class Complex {
|
||||||
@@ -36,7 +34,7 @@ Complex operator- (Complex const& left, Complex const& right); // non-member fun
|
|||||||
ostream& operator<< (ostream& ostr, Complex const& c); // non-member function
|
ostream& operator<< (ostream& ostr, Complex const& c); // non-member function
|
||||||
```
|
```
|
||||||
|
|
||||||
## 14.3 Implementation of Complex Class ([complex.cpp](complex.cpp))
|
## 13.3 Implementation of Complex Class ([complex.cpp](complex.cpp))
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// Assignment operator
|
// Assignment operator
|
||||||
@@ -72,7 +70,7 @@ ostream& operator<< (ostream & ostr, Complex const& c) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 14.4 Operators as Non-Member Functions and as Member Functions
|
## 13.4 Operators as Non-Member Functions and as Member Functions
|
||||||
|
|
||||||
- We have already written our own operators, especially **operator<**, to sort objects stored in STL containers.
|
- We have already written our own operators, especially **operator<**, to sort objects stored in STL containers.
|
||||||
- We can write them as non-member functions (e.g., **operator-**). When implemented as a non-member function,
|
- We can write them as non-member functions (e.g., **operator-**). When implemented as a non-member function,
|
||||||
@@ -91,7 +89,7 @@ Observe that the function has **only on**e argument!
|
|||||||
objects. Calling constructors for **Complex** objects inside functions, especially member functions that work on
|
objects. Calling constructors for **Complex** objects inside functions, especially member functions that work on
|
||||||
**Complex** objects, seems somewhat counter-intuitive at first, but it is common practice!
|
**Complex** objects, seems somewhat counter-intuitive at first, but it is common practice!
|
||||||
|
|
||||||
## 14.5 Assignment Operators
|
## 13.5 Assignment Operators
|
||||||
|
|
||||||
- The assignment operator: **z1 = z2**; becomes a function call: **z1.operator=(z2)**;
|
- The assignment operator: **z1 = z2**; becomes a function call: **z1.operator=(z2)**;
|
||||||
And cascaded assignments like: **z1 = z2 = z3**; are really: **z1 = (z2 = z3)**;
|
And cascaded assignments like: **z1 = z2 = z3**; are really: **z1 = (z2 = z3)**;
|
||||||
@@ -104,7 +102,7 @@ The identifier this is reserved as a pointer inside class scope to the object wh
|
|||||||
Therefore, ***this** is a a reference to this object.
|
Therefore, ***this** is a a reference to this object.
|
||||||
- The fact that **operator=** returns a reference allows us to write code of the form: **(z1 = z2).real();**
|
- The fact that **operator=** returns a reference allows us to write code of the form: **(z1 = z2).real();**
|
||||||
|
|
||||||
## 14.6 Exercise
|
## 13.6 Exercise
|
||||||
|
|
||||||
Write an operator+= as a member function of the Complex class. To do so, you must combine what you learned
|
Write an operator+= as a member function of the Complex class. To do so, you must combine what you learned
|
||||||
about operator= and operator+. In particular, the new operator must return a reference, *this.
|
about operator= and operator+. In particular, the new operator must return a reference, *this.
|
||||||
@@ -112,7 +110,7 @@ about operator= and operator+. In particular, the new operator must return a ref
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 14.7 Returning Objects vs. Returning References to Objects
|
## 13.7 Returning Objects vs. Returning References to Objects
|
||||||
|
|
||||||
- In the operator+ and operator- functions we create new Complex objects and simply return the new object.
|
- In the operator+ and operator- functions we create new Complex objects and simply return the new object.
|
||||||
The return types of these operators are both Complex.
|
The return types of these operators are both Complex.
|
||||||
@@ -128,7 +126,7 @@ This avoids creation of a new object.
|
|||||||
created object! This results in someone having a pointer to stale memory. The pointer may behave correctly
|
created object! This results in someone having a pointer to stale memory. The pointer may behave correctly
|
||||||
for a short while... until the memory under the pointer is allocated and used by someone else.
|
for a short while... until the memory under the pointer is allocated and used by someone else.
|
||||||
|
|
||||||
## 14.8 Friend Classes vs. Friend Functions
|
## 13.8 Friend Classes vs. Friend Functions
|
||||||
|
|
||||||
- In the example below, the Foo class has designated the Bar to be a friend. This must be done in the public
|
- In the example below, the Foo class has designated the Bar to be a friend. This must be done in the public
|
||||||
area of the declaration of Foo.
|
area of the declaration of Foo.
|
||||||
@@ -146,7 +144,7 @@ contents) rather than Bar claiming it. What could go wrong if we allowed friends
|
|||||||
grants these functions access similar to that of a member function. The most common example of this is
|
grants these functions access similar to that of a member function. The most common example of this is
|
||||||
operators, and especially stream operators.
|
operators, and especially stream operators.
|
||||||
|
|
||||||
## 14.9 Stream Operators as Friend Functions
|
## 13.9 Stream Operators as Friend Functions
|
||||||
|
|
||||||
- The operators >> and << are defined for the Complex class. These are binary operators.
|
- The operators >> and << are defined for the Complex class. These are binary operators.
|
||||||
The compiler translates: cout << z3 into: operator<< (cout, z3)
|
The compiler translates: cout << z3 into: operator<< (cout, z3)
|
||||||
@@ -159,7 +157,7 @@ function of the Complex class. This is why stream operators are never member fun
|
|||||||
- Stream operators are either ordinary non-member functions (if the operators can do their work through the
|
- Stream operators are either ordinary non-member functions (if the operators can do their work through the
|
||||||
public class interface) or friend functions (if they need non public access).
|
public class interface) or friend functions (if they need non public access).
|
||||||
|
|
||||||
## 14.10 Summary of Operator Overloading in C++
|
## 13.10 Summary of Operator Overloading in C++
|
||||||
|
|
||||||
- Unary operators that can be overloaded: + - * & ~ ! ++ -- -> ->*
|
- Unary operators that can be overloaded: + - * & ~ ! ++ -- -> ->*
|
||||||
- Binary operators that can be overloaded: + - * / % ^ & | << >> += -= *= /= %= ^=
|
- Binary operators that can be overloaded: + - * / % ^ & | << >> += -= *= /= %= ^=
|
||||||
@@ -176,7 +174,7 @@ operators in this order:
|
|||||||
meaning of an operator. The whole point of operators is lost if you do. One (bad) example would be
|
meaning of an operator. The whole point of operators is lost if you do. One (bad) example would be
|
||||||
defining the increment operator on a Complex number.
|
defining the increment operator on a Complex number.
|
||||||
|
|
||||||
## 14.11 Extra Practice
|
## 13.11 Extra Practice
|
||||||
|
|
||||||
- Implement the following operators for the Complex class (or explain why they cannot or should not be
|
- Implement the following operators for the Complex class (or explain why they cannot or should not be
|
||||||
implemented). Think about whether they should be non-member, member, or friend.
|
implemented). Think about whether they should be non-member, member, or friend.
|
||||||
Reference in New Issue
Block a user