1 / 14

Introduction to Effective C++ Programming

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.

datwood
Download Presentation

Introduction to Effective C++ Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction to Effective C++ Programming Kwanghee Ko Design Laboratory Department of Ocean Engineering Massachusetts Institute of Technology Day 3

  2. 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.

  3. 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.

  4. General Guidelines • Use multiple inheritance judiciously.

  5. 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();

  6. Ambiguities under Multiple Inheritance • Case 2 Top int x; Left int y; Right int z; Bottom int a

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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.

  14. 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.

More Related