xxiv CONTENTS Pitfall:Dangling Pointers 517 Static Variables and Automatic Variables 518 Programming Tip:Define Pointer Types 518 9.2 DYNAMIC ARRAYS 521 Array Variables and Pointer Variables 521 Creating and Using Dynamic Arrays 522 Pointer Arithmetic (Optional)528 Multidimensional Dynamic Arrays (Optional)530 Chapter Summary 532 Answers to Self-Test Exercises 532 Practice Programs 533 Programming Projects 534 Chapter 10 Defining Classes 541 10.1 STRUCTURES 542 Structures for Diverse Data 542 Pitfall:Forgetting a Semicolon in a Structure Definition 547 Structures as Function Arguments 548 Programming Tip:Use Hierarchical Structures 549 Initializing Structures 551 10.2 CLASSES 554 Defining Classes and Member Functions 554 Public and Private Members 559 Programming Tip:Make All Member Variables Private 567 Programming Tip:Define Accessor and Mutator Functions 567 Programming Tip:Use the Assignment Operator with Objects 569 Programming Example:BankAccount Class-Version 1 570 Summary of Some Properties of Classes 574 Constructors for Initialization 576 Programming Tip:Always Include a Default Constructor 584 Pitfall:Constructors with No Arguments 585 Member Initializers and Constructor Delegation in C++11 587 10.3 ABSTRACT DATA TYPES 588 Classes to Produce Abstract Data Types 589 Programming Example:Alternative Implementation of a Class 593
xxiv Contents Pitfall: Dangling Pointers 517 Static Variables and Automatic Variables 518 Programming Tip: Define Pointer Types 518 9.2 Dynamic Arrays 521 Array Variables and Pointer Variables 521 Creating and Using Dynamic Arrays 522 Pointer Arithmetic (Optional) 528 Multidimensional Dynamic Arrays (Optional) 530 Chapter Summary 532 Answers to Self-Test Exercises 532 Practice Programs 533 Programming Projects 534 Chapter 10 Defining Classes 541 10.1 Structures 542 Structures for Diverse Data 542 Pitfall: Forgetting a Semicolon in a Structure Definition 547 Structures as Function Arguments 548 Programming Tip: Use Hierarchical Structures 549 Initializing Structures 551 10.2 Classes 554 Defining Classes and Member Functions 554 Public and Private Members 559 Programming Tip: Make All Member Variables Private 567 Programming Tip: Define Accessor and Mutator Functions 567 Programming Tip: Use the Assignment Operator with Objects 569 Programming Example: BankAccount Class—Version 1 570 Summary of Some Properties of Classes 574 Constructors for Initialization 576 Programming Tip: Always Include a Default Constructor 584 Pitfall: Constructors with No Arguments 585 Member Initializers and Constructor Delegation in C++11 587 10.3 Abstract Data Types 588 Classes to Produce Abstract Data Types 589 Programming Example: Alternative Implementation of a Class 593
CONTENTS XXV 10.4 INTRODUCTION TO INHERITANCE 598 Derived Classes 599 Defining Derived Classes 600 Chapter Summary 604 Answers to Self-Test Exercises 605 Practice Programs 611 Programming Projects 612 Chapter I1 Friends,Overloaded Operators,and Arrays in Classes 619 11.1 FRIEND FUNCTIONS 620 Programming Example:An Equality Function 620 Friend Functions 624 Programming Tip:Define Both Accessor Functions and Friend Functions 626 Programming Tip:Use Both Member and Nonmember Functions 628 Programming Example:Money Class (Version 1)628 Implementation of digit_to_int (Optional)635 Pitfall:Leading Zeros in Number Constants 636 The const Parameter Modifier 638 Pitfall:Inconsistent Use of const 639 11.2 OVERLOADING OPERATORS 643 Overloading Operators 644 Constructors for Automatic Type Conversion 647 Overloading Unary Operators 649 Overloading >and <650 11.3 ARRAYS AND CLASSES 660 Arrays of Classes 660 Arrays as Class Members 664 Programming Example:A Class for a Partially Filled Array 665 11.4 CLASSES AND DYNAMIC ARRAYS 667 Programming Example:A String Variable Class 668 Destructors 671 Pitfall:Pointers as Call-by-Value Parameters 674
Contents xxv 10.4 Introduction to Inheritance 598 Derived Classes 599 Defining Derived Classes 600 Chapter Summary 604 Answers to Self-Test Exercises 605 Practice Programs 611 Programming Projects 612 Chapter 11 Friends, Overloaded Operators, and Arrays in Classes 619 11.1 Friend Functions 620 Programming Example: An Equality Function 620 Friend Functions 624 Programming Tip: Define Both Accessor Functions and Friend Functions 626 Programming Tip: Use Both Member and Nonmember Functions 628 Programming Example: Money Class (Version 1) 628 Implementation of digit_to_int (Optional) 635 Pitfall: Leading Zeros in Number Constants 636 The const Parameter Modifier 638 Pitfall: Inconsistent Use of const 639 11.2 Overloading Operators 643 Overloading Operators 644 Constructors for Automatic Type Conversion 647 Overloading Unary Operators 649 Overloading >> and << 650 11.3 Arrays and Classes 660 Arrays of Classes 660 Arrays as Class Members 664 Programming Example: A Class for a Partially Filled Array 665 11.4 Classes and Dynamic Arrays 667 Programming Example: A String Variable Class 668 Destructors 671 Pitfall: Pointers as Call-by-Value Parameters 674
xxvi CONTENTS Copy Constructors 675 Overloading the Assignment Operator 680 Chapter Summary 683 Answers to Self-Test Exercises 683 Practice Programs 693 Programming Projects 694 Chapter 12 Separate Compilation and Namespaces 703 12.1 SEPARATE COMPILATION 704 ADTs Reviewed 705 Case Study:DigitalTime-A Class Compiled Separately 706 Using #ifndef 715 Programming Tip:Defining Other Libraries 718 12.2 NAMESPACES 719 Namespaces and using Directives 719 Creating a Namespace 721 Qualifying Names 724 A Subtle Point About Namespaces (Optional)725 Unnamed Namespaces 726 Programming Tip:Choosing a Name for a Namespace 731 Pitfall:Confusing the Global Namespace and the Unnamed Namespace 732 Chapter Summary 733 Answers to Self-Test Exercises 734 Practice Programs 736 Programming Projects 738 Chapter 13 Pointers and Linked Lists 739 13.1 NODES AND LINKED LISTS 740 Nodes 740 nullptr 745 Linked Lists 746 Inserting a Node at the Head of a List 747 Pitfall:Losing Nodes 750 Searching a Linked List 751
xxvi Contents Copy Constructors 675 Overloading the Assignment Operator 680 Chapter Summary 683 Answers to Self-Test Exercises 683 Practice Programs 693 Programming Projects 694 Chapter 12 Separate Compilation and Namespaces 703 12.1 Separate Compilation 704 ADTs Reviewed 705 Case Study: DigitalTime —A Class Compiled Separately 706 Using #ifndef 715 Programming Tip: Defining Other Libraries 718 12.2 Namespaces 719 Namespaces and using Directives 719 Creating a Namespace 721 Qualifying Names 724 A Subtle Point About Namespaces (Optional) 725 Unnamed Namespaces 726 Programming Tip: Choosing a Name for a Namespace 731 Pitfall: Confusing the Global Namespace and the Unnamed Namespace 732 Chapter Summary 733 Answers to Self-Test Exercises 734 Practice Programs 736 Programming Projects 738 Chapter 13 Pointers and Linked Lists 739 13.1 Nodes and Linked Lists 740 Nodes 740 nullptr 745 Linked Lists 746 Inserting a Node at the Head of a List 747 Pitfall: Losing Nodes 750 Searching a Linked List 751
CONTENTS xxvii Pointers as Iterators 755 Inserting and Removing Nodes Inside a List 755 Pitfall:Using the Assignment Operator with Dynamic Data Structures 757 Variations on Linked Lists 760 Linked Lists of Classes 762 13.2 STACKS AND QUEUES 765 Stacks 765 Programming Example:A Stack Class 766 Queues 771 Programming Example:A Queue Class 772 Chapter Summary 776 Answers to Self-Test Exercises 776 Practice Programs 779 Programming Projects 780 Chapter 14 Recursion 789 14.1 RECURSIVE FUNCTIONS FOR TASKS 791 Case Study:Vertical Numbers 791 A Closer Look at Recursion 797 Pitfall:Infinite Recursion 799 Stacks for Recursion 800 Pitfall:Stack Overflow 802 Recursion Versus Iteration 802 14.2 RECURSIVE FUNCTIONS FOR VALUES 804 General Form for a Recursive Function That Returns a Value 804 Programming Example:Another Powers Function 804 14.3 THINKING RECURSIVELY 809 Recursive Design Techniques 809 Case Study:Binary Search-An Example of Recursive Thinking 810 Programming Example:A Recursive Member Function 818 Chapter Summary 822 Answers to Self-Test Exercises 822 Practice Programs 827 Programming Projects 827
Contents xxvii Pointers as Iterators 755 Inserting and Removing Nodes Inside a List 755 Pitfall: Using the Assignment Operator with Dynamic Data Structures 757 Variations on Linked Lists 760 Linked Lists of Classes 762 13.2 Stacks and Queues 765 Stacks 765 Programming Example: A Stack Class 766 Queues 771 Programming Example: A Queue Class 772 Chapter Summary 776 Answers to Self-Test Exercises 776 Practice Programs 779 Programming Projects 780 Chapter 14 Recursion 789 14.1 Recursive Functions for Tasks 791 Case Study: Vertical Numbers 791 A Closer Look at Recursion 797 Pitfall: Infinite Recursion 799 Stacks for Recursion 800 Pitfall: Stack Overflow 802 Recursion Versus Iteration 802 14.2 Recursive Functions for Values 804 General Form for a Recursive Function That Returns a Value 804 Programming Example: Another Powers Function 804 14.3 Thinking Recursively 809 Recursive Design Techniques 809 Case Study: Binary Search—An Example of Recursive Thinking 810 Programming Example: A Recursive Member Function 818 Chapter Summary 822 Answers to Self-Test Exercises 822 Practice Programs 827 Programming Projects 827
xxviii CONTENTS Chapter 15 Inheritance 833 15.1 INHERITANCE BASICS 834 Derived Classes 837 Constructors in Derived Classes 845 Pitfall:Use of Private Member Variables from the Base Class 848 Pitfall:Private Member Functions Are Effectively Not Inherited 850 The protected Qualifier 850 Redefinition of Member Functions 853 Redefining Versus Overloading 856 Access to a Redefined Base Function 858 15.2 INHERITANCE DETAILS 859 Functions That Are Not Inherited 859 Assignment Operators and Copy Constructors in Derived Classes 860 Destructors in Derived Classes 861 15.3 POLYMORPHISM 862 Late Binding 863 Virtual Functions in C++864 Virtual Functions and Extended Type Compatibility 869 Pitfall:The Slicing Problem 873 Pitfall:Not Using Virtual Member Functions 874 Pitfall:Attempting to Compile Class Definitions Without Definitions for Every Virtual Member Function 875 Programming Tip:Make Destructors Virtual 875 Chapter Summary 877 Answers to Self-Test Exercises 877 Practice Programs 881 Programming Projects 884 Chapter 16 Exception Handling 893 16.1 EXCEPTION-HANDLING BASICS 895 A Toy Example of Exception Handling 895 Defining Your Own Exception Classes 904 Multiple Throws and Catches 904 Pitfall:Catch the More Specific Exception First 908 Programming Tip:Exception Classes Can Be Trivial 909 Throwing an Exception in a Function 909
xxviii Contents Chapter 15 Inheritance 833 15.1 Inheritance Basics 834 Derived Classes 837 Constructors in Derived Classes 845 Pitfall: Use of Private Member Variables from the Base Class 848 Pitfall: Private Member Functions Are Effectively Not Inherited 850 The protected Qualifier 850 Redefinition of Member Functions 853 Redefining Versus Overloading 856 Access to a Redefined Base Function 858 15.2 INHERITANCE DETAILS 859 Functions That Are Not Inherited 859 Assignment Operators and Copy Constructors in Derived Classes 860 Destructors in Derived Classes 861 15.3 Polymorphism 862 Late Binding 863 Virtual Functions in C++ 864 Virtual Functions and Extended Type Compatibility 869 Pitfall: The Slicing Problem 873 Pitfall: Not Using Virtual Member Functions 874 Pitfall: Attempting to Compile Class Definitions Without Definitions for Every Virtual Member Function 875 Programming Tip: Make Destructors Virtual 875 Chapter Summary 877 Answers to Self-Test Exercises 877 Practice Programs 881 Programming Projects 884 Chapter 16 Exception Handling 893 16.1 Exception-Handling Basics 895 A Toy Example of Exception Handling 895 Defining Your Own Exception Classes 904 Multiple Throws and Catches 904 Pitfall: Catch the More Specific Exception First 908 Programming Tip: Exception Classes Can Be Trivial 909 Throwing an Exception in a Function 909