140 likes | 155 Views
This course provides a comprehensive introduction to effective C++ programming, covering general guidelines and best practices for writing efficient and readable code. Topics include avoiding memory leakage, inheritance models, multiple inheritance, ambiguities under multiple inheritance, and more.
E N D
Introduction to Effective C++ Programming Kwanghee Ko Design Laboratory Department of Ocean Engineering Massachusetts Institute of Technology Day 3
General Guidelines • Avoid returning “handles” to internal data. • Avoid member functions that return non-const pointers or references to members less accessible than themselves. • Never return a reference to a local object or to a dereferenced pointer initialized by new with in the function (memory leakage). • Postpone variable definitions as long as possible.
General Guidelines • Public inheritance models : “isa” relation? • Ex. A bus is a vehicle? • Never redefine an inherited non-virtual function. • Never redefine an inherited default parameter value. • Avoid cast down the inheritance hierarchy. • Model “has-a” or “is-implemented-in-terms-of” through layering.
General Guidelines • Use multiple inheritance judiciously.
Ambiguities under Multiple Inheritance • Case 1 Derived d; d.g(); // OK d.h(); // OK d.f(); // Ambiguous!!! d.Base1::f(); // OK d.Base2::f(); // OK Base 1 f(); g(); Base 2 f(); h(); Derived j(); k();
Ambiguities under Multiple Inheritance • Case 2 Top int x; Left int y; Right int z; Bottom int a
Ambiguities under Multiple Inheritance Default inheritance mechanism -> maintains separate copies of the data members inherited from all base classes. • Case 2 Top int x; Left int y; Right int z; Bottom int a
Ambiguities under Multiple Inheritance • Case 2 (Non-virtual Base class) Top int x; Top int x; Top int x; Top int x; Left int y; Right int z; Left int y; Right int z; Bottom int a Bottom int a
Ambiguities under Multiple Inheritance • Case 2 : Virtual Base Class class Left::public virtual Top{…} class Right::public virtual Top{…} Top int x; virtual virtual Top int x; Left int y; Right int z; Left int y; Right int z; Bottom int a Bottom int a
Ambiguities under Multiple Inheritance • Case 2 : Virtual Base Class Top int x; Inherently ambiguous!!! Ex) Bottom b; b.x -> b.Left::x? b.Right::x? b.Top::x? virtual virtual Left int y; Right int z; Bottom int a
Ambiguities under Multiple Inheritance • Case 2 : Virtual Base Class Top int x; • Assignment for Top::x happens twice. • Bottom->Left->Top • Bottom->Right->Top virtual virtual Left int y; Right int z; Bottom int a
Ambiguities under Multiple Inheritance • Case 2 : Virtual Base Class Top int x; • Assignment for Top::x happens twice. • Bottom->Left->Top • Bottom->Right->Top virtual virtual Left int y; Right int z; Solution??? Bottom int a
General Guidelines • Use multiple inheritance judiciously. • Before using virtual base classes, understand them thoroughly. • Use an experimental program to understand its behavior. • If a public base class does not have a virtual destructor, no derived class should have a destructor. • If a multiple inheritance hierarchy has any destructors, every base class should have a virtual destructor.
General Guidelines • Declare a copy constructor and an assignment operator for classes with dynamically allocated memory. • Prefer initialization to assignment in constructors. • List members in an initialization list in the order in which they are declared. • Make sure base classes have virtual destructors. • Have operator= return a reference to *this. • Assign to all data members in operator=. • Check for assignment to self in operator=. • Overloading vs. default argument.