Instructor: David Kieras
This elective course introduces advanced concepts and techniques in practical C/C++ programming. We will start with a quick, but deep, introduction to important topics in C programming, and then the course will emphasize object-oriented programming with the use of single and multiple inheritance and polymorphism, and using the Standard Library algorithms and containers. Key ideas in object-oriented analysis and design and common design patterns will be introduced. Programming projects will focus on learning and using techniques that are valuable for professional practice in developing and extending large scale or high-performance software relatively easily. In addition to these content goals, an important function of the course is to help students develop good programming practices, style, and skill, with as much personalized coaching and critique of individual student's code as possible. In short, the course is intended for those who want to become outstanding programmers.
Since the course concerns the concepts and techniques for building and maintaining complex software, you will be expected to design, write, test, and debug a relatively large amount of code throughout the semester, making this a very high workload course.
Kernighan, Brian W., and Dennis M. Ritchie. The C Programming Language. Englewood Cliffs, NJ: Prentice Hall, 1988.
Stroustrup, Bjarne. The C++ Programming Language. 3rd ed. Reading, MA: Addison-Wesley, 1997.
The course will cover the following topics in this order.
1. Short course on programming concepts in the C language:
• The separate compilation model, declarations vs definitions, function prototypes. Internal/external linkage and the linker, the one-definition rule, undefined behavior.
• Incomplete declarations, pointers, function pointers, void pointers, type safety, type casts.
• Memory allocation and management, basic C stream and file I/O.
2. C++ fundamentals:
• C++ as a "better C".
• Exceptions and exception safety, namespaces, classes, static members, classes that manage resources.
• Operator overloading, generic programming, basic use of function and class templates.
• The C++ Standard Library: Organization, containers, algorithms, iterators, function objects, binders, adapters, strings, streams.
• Inheritance, substitution principle, multiple inheritance, polymorphism, virtual functions.
• Run-time type identification, dynamic casts, up-, down-, and cross-casting, RAII, "smart pointers"
3. Object-oriented programming concepts:
• Basic class design principles - collaborations and responsibilities; separating interface and implementation; decoupling.
• Object-oriented principles and techniques - using a polymorphic class hierarchy; abstract base classes for common interface.
• Major object-oriented idioms and design patterns - providing extensibility and code stability simultaneously.