Presentation is loading. Please wait.

Presentation is loading. Please wait.

March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 1 Alumni Party The Alumni Party will take place on Tuesday, May 13 It would be great.

Similar presentations


Presentation on theme: "March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 1 Alumni Party The Alumni Party will take place on Tuesday, May 13 It would be great."— Presentation transcript:

1 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 1 Alumni Party The Alumni Party will take place on Tuesday, May 13 It would be great if we could have demos of your software projects!

2 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 2 Building GUIs under Linux There are many toolkits available for building graphical user interfaces under Linux. Probably the most popular one is GTK+. You can find a nice and comprehensive tutorial at: This tutorial also explains how to download and install the required libraries and compile your code.

3 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 3 ADT Conversions Remember: We can provide a special conversion function inside a user-defined class. The general form of such a member function is: operator type() { … } Such a member function must be nonstatic, have no parameters, have no declared return type, return an expression of the designated type.

4 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 4 ADT Conversions For example, we could add such a special conversion function to the ModInt class: ModInt::operator int() { return v; } Then the following code is correct: int i = 39; ModInt m; i = m;

5 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 5 Overloading Operators We now know how to use the operator keyword to define a type-conversion member function. We will now take a look at how to use the operator keyword to overload the built-in C++ operators. We have already seen that overloading can give a function name a variety of meanings, depending on its arguments. Overloading operators can give additional meanings to the built-in operators such as ‘+’, allows infix expressions of both ADTs and built-in types, leads to shorter, more readable programs.

6 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 6 Overloading Operators Example: class Foo { public: Foo operator-(); // unary minus: -Foo Foo operator-(int); // binary minus: Foo – int Foo operator-(Foo); // binary minus: Foo – Foo }; Foo operator-(int, Foo);// binary minus: int - Foo

7 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 7 Unary Operator Overloading Example: class Clock { public: Clock(unsigned long i); void Print() const { cout << mins << ":" << secs << endl; } void Tick();// add one second Clock operator++() { Tick(); return *this; } private: unsigned long totSecs, secs, mins; };

8 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 8 Unary Operator Overloading Clock::Clock(unsigned long i) { totSecs = i; secs = totSecs % 60;// convert into minutes-seconds format mins = (totSecs / 60) % 60; } void Clock::Tick() { Clock Temp = Clock(++totSecs); secs = Temp.secs; mins = Temp.mins; }

9 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 9 Unary Operator Overloading int main() { Clock C1(59), C2(600); cout << "Initial times:" << endl; C1.Print(); C2.Print(); cout << endl; ++C1;// increase times by one second ++C2; cout << "After one second times are:" << endl; C1.Print(); C2.Print(); cout << endl; }

10 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 10 Unary Operator Overloading Output: Initial times: 0:59 10:0 After one second times are: 1:0 10:1

11 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 11 Unary Operator Overloading We could also have overloaded the prefix ++ by using an ordinary function: Clock operator++(Clock& C) { C.Tick(); return C; }

12 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 12 Binary Operator Overloading We continue with our clock example and show how to overload binary operators. When a binary operator is overloaded using a member function, it has as its first argument the implicitly passed class variable, as its second argument the single argument-list parameter. Friend functions and ordinary functions have both arguments specified in the parameter list. Of course, ordinary functions cannot access private members.

13 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 13 Binary Operator Overloading class Clock { … friend Clock operator+(Clock C1, Clock C2); }; Clock operator+(Clock C1, Clock C2) { return (C1.totSecs + C2.totSecs); } Here, the Clock constructor provides the implicit conversion from unsigned long to Clock.

14 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 14 Binary Operator Overloading Analogously, we can overload the multiplication operator: class Clock { … friend Clock operator*(unsigned long factor, Clock C); } Clock operator*(unsigned long factor, Clock C) { return (factor*C.totSecs); } Notice that this function demands a fixed ordering (unsigned long * Clock).

15 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 15 Binary Operator Overloading To avoid this, we can add a second overloaded function: Clock operator*(Clock C, unsigned long factor) { return (factor*C); } Notice that this second function overloading ‘*’ is defined in terms of the first one. Therefore, we do not need to make it a friend function.

16 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 16 Binary Operator Overloading Testing the new functions: int main() { … cout << "The sum of these times is:" << endl; Clock C3 = C1 + C2; C3.Print(); cout<< endl; cout << "Multiplied by two is:" << endl; Clock C4 = 2*C3; C4.Print(); cout<< endl; }

17 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 17 Binary Operator Overloading Output: Initial times: 0:59 10:0 After one second times are: 1:0 10:1 The sum of these times is: 11:1 Multiplied by two is: 22:2

18 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 18 Overloading the << Operator Do you remember the Clock example? class Clock { public: Clock(unsigned long i = 0); void Print() const { cout << mins << ":" << secs << endl; } void Tick();// add one second Clock operator++() { Tick(); return *this; } private: unsigned long totSecs, secs, mins; };

19 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 19 Overloading the << Operator Printing a time value works as follows: int main() { Clock C1(59), C2(600); cout << "Initial times:" << endl; C1.Print(); C2.Print(); cout << endl; } It would be more convenient to use the << operator for creating output, so we are going to overload the << operator for Clock objects.

20 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 20 Overloading the << Operator How does the << operator work? Example: int main() { string text1(“John is ”), text2(“years old.”); int age = 43; cout << text1 << age << text2; }

21 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 21 Overloading the << Operator cout << text1 << age << text2; ostream &operator<<(ostream &ostr, string &s); cout << age << text2; ostream &operator<<(ostream &ostr, int i); cout << age << text2; cout << text2; …

22 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 22 Overloading the << Operator In order to overload the << operator for printing Clock objects, we add the following code to the Clock class: class Clock { public: … friend ostream &operator<<(ostream &out, Clock C); … }; ostream &operator<<(ostream &out, Clock C) { return (out << C.mins << ":" << C.secs); }

23 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 23 Overloading the << Operator With this addition, we can output Clock values as follows: int main() { Clock C1(59), C2(600); cout << "Initial times:\n" << C1 << "\n" << C2; C1++; C2++; cout << "\n\nAfter one second times are:\n" << C1 << "\n" << C2; Clock C3 = C1 + C2; cout << "\n\nThe sum of these times is:\n" << C3; Clock C4 = 2*C3; cout << "\n\nMultiplied by two is:\n" << C4 << "\n"; }

24 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 24 Overloading the << Operator The output looks like before: Initial times: 0:59 10:0 After one second times are: 1:0 10:1 The sum of these times is: 11:1 Multiplied by two is: 22:2

25 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 25 Overloading the << Operator Overloading the <<, (), and = operators can be nicely demonstrated with the Matrix example. In order to overload the << operator for printing matrices, we add the following code: class Matrix { public: … friend ostream &operator<<(ostream &out, const Matrix &m); … }; (continued on next slide)

26 March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 26 Overloading the << Operator ostream &operator<<(ostream &out, const Matrix &m) { out << endl; for (int y = 0; y < m.dy; y++) { for (int x = 0; x < m.dx; x++) out << m.p[x][y] << "\t"; out << endl; } return out; }


Download ppt "March 25, 2014CS410 – Software Engineering Lecture #12: Advanced C++ I 1 Alumni Party The Alumni Party will take place on Tuesday, May 13 It would be great."

Similar presentations


Ads by Google