Preface
"The chief merit of language is
clearness . . ."
—Galen
Welcome to C++ for Programmers! At Deitel & Associates, we write programming
language professional books and textbooks for publication by Prentice Hall,
deliver programming languages corporate training courses at organizations
worldwide and develop Internet businesses. This book is intended for programmers
who do not yet know C++, and may or may not know object-oriented
programming.
Features of C++
for Programmers
The Tour of the Book section of this
Preface will give you a sense of C++ for
Programmers' coverage of C++ and object-oriented
programming. Here's some key features of the book:
-
Early
Classes and Objects Approach. We present object-oriented programming,
where appropriate, from the start and throughout the text.
-
Integrated Case Studies. We
develop the GradeBook class in Chapters
3–7,
the Time class in several sections of Chapters
9–10,
the Employee class in Chapters
12–13,
and the optional OOD/UML ATM case study in Chapters
1–7,
9,
13
and Appendix
E.
-
Unified Modeling Language™ 2 (UML
2). The Unified Modeling Language (UML) has
become the preferred graphical modeling language for designers of
object-oriented systems. We use UML class diagrams to visually represent classes
and their inheritance relationships, and we use UML activity diagrams to
demonstrate the flow of control in each of C++'s control statements. We
emphasize the UML in the optional OOD/UML ATM case study
-
Optional OOD/UML ATM Case
Study. We introduce a concise subset of the UML 2,
then guide you through a first design experience intended for the novice
object-oriented designer/programmer. The case study was reviewed by a
distinguished team of OOD/UML industry professionals and academics. The case
study is not an exercise; rather, it's a fully developed end-to-end learning
experience that concludes with a detailed walkthrough of the complete 877-line
C++ code implementation. We take a detailed tour of the nine sections of this
case study later in the Preface.
-
Function Call Stack
Explanation. In Chapter
6, we provide a detailed discussion (with
illustrations) of the function call stack and activation records to explain how
C++ is able to keep track of which function is currently executing, how
automatic variables of functions are maintained in memory and how a function
knows where to return after it completes execution.
-
Class string. We use class string instead of C-like pointer-based
char * strings for most string manipulations throughout
the book. We include discussions of char * strings
in Chapters
8, 10,
11
and 19 to give you practice with pointer manipulations, to
illustrate dynamic memory allocation with new and delete, to build our own String class,
and to prepare you for working with char * strings
in C and C++ legacy code.
-
Class Template
vector. We use class template vector instead of C-like pointer-based array manipulations
throughout the book. However, we begin by discussing C-like pointer-based arrays
in Chapter
7 to prepare you for working with C and C++ legacy code
and to use as a basis for building our own customized Array class in Chapter
11.
-
Treatment of Inheritance and
Polymorphism. Chapters
12–13
include an Employee class hierarchy that
makes the treatment of inheritance and polymorphism clear and accessible for
programmers who are new to OOP.
-
Discussion and Illustration of How
Polymorphism Works "Under the Hood." Chapter
13 contains a detailed diagram and explanation of how C++ can implement
polymorphism, virtual functions and dynamic
binding internally. This gives you a solid understanding of how these
capabilities really work. More importantly, it helps you appreciate the overhead
of polymorphism—in terms of additional memory consumption and processor time.
This helps you determine when to use polymorphism and when to avoid it.
-
Standard Template Library (STL). This might be one of the most important topics in the book in
terms of software reuse. The STL defines powerful, template-based, reusable
components that implement many common data structures and algorithms used to
process those data structures. Chapter
20 introduces the STL and discusses its three
key components—containers, iterators and algorithms. Using STL components
provides tremendous expressive power, often reducing many lines of non-STL code
to a single statement.
-
ISO/IEC C++ Standard
Compliance. We have audited our presentation
against the most recent ISO/IEC C++ standard document for completeness and
accuracy. [Note: A PDF copy
of the C++ standard (document number INCITS/ISO/IEC 14882-2003) can be purchased
at webstore.ansi.org/ansidocstore/default.asp.]
-
Future of C++. In Chapter
21, which considers the future of C++, we introduce
the Boost C++ Libraries, Technical Report 1 (TR1) and C++0x. The free Boost open
source libraries are created by members of the C++ community. Technical Report 1
describes the proposed changes to the C++ Standard Library, many of which are
based on current Boost libraries. The C++ Standards Committee is revising the
C++ Standard. The main goals for the new standard are to make C++ easier to
learn, improve library building capabilities, and increase compatibility with
the C programming language. The last standard was published in 1998. Work on the
new standard, currently referred to as C++0x, began in 2003. The new standard is
likely to be released in 2009. It will include changes to the core language and,
most likely, many of the libraries in TR1. We overview the TR1 libraries and
provide code examples for the "regular expression" and "smart pointer"
libraries.
-
Debugger Appendices. We include two Using the Debugger appendices—Appendix
G, Using the Visual Studio Debugger, and Appendix
H, Using the GNU C++ Debugger.
-
Code Testing on Multiple
Platforms. We tested the code examples on various
popular C++ platforms. For the most part, the book's examples port easily to
standard-compliant compilers.
-
Errors and
Warnings Shown for Multiple Platforms. For programs that intentionally contain errors
to illustrate a key concept, we show the error messages that result on several
popular platforms.
All of this was carefully reviewed
by distinguished industry developers and academics. We believe that this book
will provide you with an informative, interesting, challenging and entertaining
C++ educational experience.
As you read this book, if you have
questions, send an e-mail to deitel@deitel.com;
we'll respond promptly. For updates on this book and the status of all
supporting C++ software, and for the latest news on all Deitel publications and
services, visit www.deitel.com. Sign up at www.deitel.com/newsletter/subscribe.html for the free Deitel® Buzz Online e-mail newsletter and check out our growing list of
C++ and related Resource Centers at www.deitel.com/ResourceCenters.html.
Each week we announce our latest Resource Centers in the newsletter.
Learning Features
C++ for Programmers contains a rich collection of examples. The book
concentrates on the principles of good software engineering and stresses program
clarity. We teach by example. We are educators who teach programming languages
in industry classrooms worldwide. The Deitels have taught courses at all levels
to government, industry, military and academic clients of Deitel &
Associates.
Live-Code Approach. C++ for Programmers is
loaded with "live-code" examples—by this we mean that each new concept is
presented in the context of a complete working C++ application that is
immediately followed by one or more actual executions showing the program's
inputs and outputs.
Syntax Shading. We
syntax-shade all the C++ code, similar to the way most C++ integrated
development environments (IDEs) and code editors syntax-color code. This greatly
improves code readability—an especially important goal, given that this book
contains over 15,500 lines of code. Our syntax-shading conventions are as
follows:
comments appear in italic
keywords appear in bold italic
errors and ASP.NET script delimiters appear in bold black
constants and literal values appear in bold gray
all other code appears in plain black
Code Highlighting. We place white rectangles around the key code
segments in each program.
Using
Fonts for Emphasis. We place the key terms and the
index's page reference for each defining occurrence in bold italic text for easier reference. We
emphasize on-screen components in the bold
Helvetica font (e.g., the File menu) and
emphasize C++ program text in the Lucida font (e.g., int x =
5).
Web Access. All of the
source-code examples for C++ for Programmers are
available for download from www.deitel.com/books/cppfp/.
Objectives. Each chapter begins with a statement of objectives. This
lets you know what to expect and gives you an opportunity, after reading the
chapter, to determine if you've met the objectives.
Quotations. The learning objectives are followed by quotations.
Some are humorous; some are philosophical; others offer interesting insights. We
hope that you enjoy relating the quotations to the chapter material.
Outline. The chapter outlines help you approach the material in
a top-down fashion, so you can anticipate what is to come and set a comfortable
and effective learning pace.
Illustrations/Figures. Abundant charts, tables, line drawings, programs and program
output are included. We model the flow of control in control statements with UML
activity diagrams. UML class diagrams model the fields, constructors and methods
of classes. We make extensive use of six major UML diagram types in the optional
OOD/UML 2 ATM case study.
Programming Tips. We
include programming tips to help you focus on important aspects of program
development. These tips and practices represent the best we've gleaned from a
combined seven decades of programming experience—they provide a basis on which
to build good software.
Good Programming Practice
|
Good Programming Practices call attention to techniques that will help you
produce programs that are clearer, more understandable and more
maintainable. |
Common Programming Error
|
Pointing out these Common Programming Errors reduces the likelihood that you'll make the same
mistakes. |
Error-Prevention Tip
|
These tips
contain suggestions for exposing bugs and removing them from your programs; many
describe aspects of C++ that prevent bugs from getting into programs in the
first place. |
Performance Tip
|
These tips
highlight opportunities for making your programs run faster or minimizing the
amount of memory that they
occupy. |
Portability Tip
|
We include Portability Tips
to help you write code that will
run on a variety of platforms and to explain how C++ achieves its high degree of
portability. |
Software Engineering Observation
|
The
Software Engineering Observations highlight architectural and design issues that
affect the construction of software systems, especially large-scale
systems. |
Wrap-Up Section. Each of the chapters ends with a brief "wrap-up" section
that recaps the chapter content and transitions to the next chapter.
Thousands of Index
Entries. We've included an extensive index
which is especially useful when you use the book as a reference.
"Double Indexing" of C++
Live-Code Examples. For every source-code program in
the book, we index the figure caption both alphabetically and as a subindex item
under "Examples." This makes it easier to find examples using particular
features.
Tour of the Book
You'll now take a tour of the C++
capabilities you'll study in C++ for Programmers.
Figure 1 illustrates the dependencies among the chapters. We
recommend studying the topics in the order indicated by the arrows, though other
orders are possible.
Chapter
1, Introduction, discusses the
origin of the C++ programming language, and introduces a typical C++ programming
environment. We walk through a "test drive" of a typical C++ application on the
Windows and Linux platforms. We also introduce basic object technology concepts
and terminology, and the Unified Modeling Language.
Chapter
2, Introduction to C++ Programming, provides a
lightweight introduction to programming applications in C++. The programs in
this chapter illustrate how to display data on the screen, obtain data from the
keyboard, make decisions and perform arithmetic operations.
Chapter
3, Introduction to Classes and Objects,
provides a friendly early introduction to classes and objects. We introduce
classes, objects, member functions, constructors and data members using a series
of simple real-world examples. We develop a well-engineered framework for
organizing object-oriented programs in C++. We motivate the notion of classes
with a simple example. Then we present a carefully paced sequence of seven
complete working programs to demonstrate creating and using your own classes.
These examples begin our integrated case study on
developing a grade-book class that an instructor
can use to maintain student test scores. This case study is enhanced over the
next several chapters, culminating with the version presented in Chapter
7. The GradeBook class
case study describes how to define a class and how to use it to create an
object. The case study discusses how to declare and define member functions to
implement the class's behaviors, how to declare data members to implement the
class's attributes and how to call an object's member functions to make them
perform their tasks. We introduce C++ Standard Library class string and
create string objects to store the name of the
course that a GradeBook object represents. We
explain the differences between data members of a class and local variables of a
function, and how to use a constructor to ensure that an object's data is
initialized when the object is created. We show how to promote software
reusability by separating a class definition from the client code (e.g.,
function main) that uses the class. We also
introduce another fundamental principle of good software engineering—separating
interface from implementation.
Chapter
4, Control Statements: Part 1, focuses
on the program-development process involved in creating useful classes. The
chapter introduces some control statements for decision making (if and
if...else) and repetition (while). We examine
counter-controlled and sentinel-controlled repetition using the GradeBook class from Chapter
3, and introduce C++'s increment, decrement and
assignment operators. The chapter includes two enhanced versions of the
GradeBook class, each based on Chapter
3's final version. The chapter uses simple UML
activity diagrams to show the flow of control through each of the control
statements.
Chapter
5, Control Statements: Part 2, continues the discussion of C++ control statements with
examples of the for repetition statement, the
do...while repetition statement, the switch selection
statement, the break statement and the continue statement. We
create an enhanced version of class
GradeBook that uses a switch statement to count the number of A, B, C, D and F grades
entered by the user. The chapter also a discusses logical operators.
Chapter
6, Functions and an Introduction to Recursion, takes a deeper look inside objects and their member
functions. We discuss C++ Standard Library functions and examine more closely
how you can build your own functions. The chapter's first example continues the
GradeBook class case study with an example of a function with multiple
parameters. You may enjoy the chapter's treatment of random numbers and
simulation, and the discussion of the dice game of craps, which makes elegant
use of control statements. The chapter discusses the so-called "C++ enhancements
to C," including inline functions,
reference parameters, default arguments, the unary scope resolution operator,
function overloading and function templates. We also present C++'s call-by-value
and call-by-reference capabilities. The header files table introduces many of
the header files that you'll use throughout the book. We discuss the function
call stack and activation records to explain how C++ keeps track of which
function is currently executing, how automatic variables of functions are
maintained in memory and how a function knows where to return after it completes
execution. The chapter then offers a solid introduction to recursion.
Chapter
7, Arrays and Vectors, explains how to
process lists and tables of values. We discuss the structuring of data in arrays
of data items of the same type and demonstrate how arrays facilitate the tasks
performed by objects. The early parts of this chapter use C-style, pointer-based
arrays, which, as you'll see in Chapter
8, can be treated as pointers to the array contents in
memory. We then present arrays as full-fledged objects, introducing the C++
Standard Library vector class template—a
robust array data structure. The chapter presents numerous examples of both
one-dimensional arrays and two-dimensional arrays. Examples in the chapter
investigate various common array manipulations, printing bar charts, sorting
data and passing arrays to functions. The chapter includes the final two GradeBook case study sections, in which we use arrays to store student grades for the
duration of a program's execution. Previous versions of the class process a set
of grades entered by the user, but do not maintain the individual grade values
in data members of the class. In this chapter, we use arrays to enable an object
of the GradeBook class to maintain a set of
grades in memory, thus eliminating the need to repeatedly input the same set of
grades. The first version of the class stores the grades in a one-dimensional
array. The second version uses a two-dimensional array to store the grades of a
number of students on multiple exams in a semester. Another key feature of this
chapter is the discussion of elementary sorting and searching techniques.
Chapter
8, Pointers and Pointer-Based Strings,
presents one of the most powerful features of the C++ language—pointers. The
chapter provides detailed explanations of pointer operators, call by reference,
pointer expressions, pointer arithmetic, the relationship between pointers and
arrays, arrays of pointers and pointers to functions. We demonstrate how to use
const with pointers to enforce the principle
of least privilege to build more robust software. We discuss using the
sizeof operator to determine the size of a data
type or data items in bytes during program compilation. There is an intimate
relationship between pointers, arrays and C-style strings in C++, so we
introduce basic C-style string-manipulation concepts and discuss some of the
most popular C-style string-handling functions, such as getline (input
a line of text), strcpy and strncpy (copy a string),
strcat and strncat (concatenate two strings), strcmp
and strncmp (compare two strings), strtok
("tokenize" a string into its pieces) and strlen (return the length of
a string). We frequently use string objects (introduced in Chapter
3) in place of C-style, char * pointer-based strings. However, we
include char * strings in Chapter
8 to help you master pointers and prepare for the
professional world in which you'll see a great deal of C legacy code that has
been implemented over the last three decades. In C and "raw C++" arrays and
strings are pointers to array and string contents in memory (even function names
are pointers).
Chapter
9, Classes: A Deeper Look, Part 1, continues our discussion of object-oriented programming.
This chapter uses a rich Time class case
study to illustrate accessing class members, separating interface from
implementation, using access functions and utility functions, initializing
objects with constructors, destroying objects with destructors, assignment by
default memberwise copy and software reusability. We discuss the order in which
constructors and destructors are called during the lifetime of an object. A
modification of the Time case study
demonstrates the problems that can occur when a member function returns a
reference to a private data member,
which breaks the encapsulation of the class.
Chapter
10, Classes: A Deeper Look, Part 2,
continues the study of classes and presents additional object-oriented
programming concepts. The chapter discusses declaring and using constant
objects, constant member functions, composition—the process of building classes
that have objects of other classes as members, friend functions and
friend classes that have special access rights to the
private and protected members of classes, the this pointer, which enables an object to know its own address,
dynamic memory allocation, static class
members for containing and manipulating class-wide data, examples of popular
abstract data types (arrays, strings and queues), container classes and
iterators. In our discussion of const objects,
we mention keyword mutable which is used in a subtle
manner to enable modification of "non-visible" implementation in
const objects. We discuss dynamic
memory allocation using new and delete. When new fails, the program terminates by default because
new "throws an exception" in standard C++. We
motivate the discussion of static class members
with a video-game-based scenario. We emphasize how important it is to hide
implementation details from clients of a class; then, we discuss proxy classes,
which provide a means of hiding implementation (including the private
data in class headers) from clients of a class.
Chapter
11, Operator Overloading; String and Array Objects, presents one of the most popular topics in our C++ courses.
Professionals really enjoy this material. They find it a perfect complement to
the detailed discussion of crafting valuable classes in Chapters
9 and 10. Operator overloading enables you to tell the compiler how
to use existing operators with objects of new types. C++ already knows how to
use these operators with built-in types, such as integers, floats and
characters. But suppose that we create a new String class—what would
the plus sign mean when used between String objects? Many programmers
use plus (+) with strings to mean concatenation. In Chapter
11, you'll see how to "overload" the plus sign, so
when it is written between two String objects
in an expression, the compiler will generate a function call to an "operator
function" that will concatenate the two Strings. The chapter discusses the fundamentals of
operator overloading, restrictions in operator overloading, overloading with
class member functions vs. with nonmember functions, overloading unary and
binary operators and converting between types. Chapter
11 features a collection of substantial case
studies including an Array class, a String class
and a Date class. Using operator overloading
wisely helps you add extra "polish" to your classes.
Chapter
12, Object-Oriented Programming: Inheritance,
introduces one of the most fundamental capabilities of object-oriented
programming languages—inheritance: a form of software reusability in which new
classes are developed quickly and easily by absorbing the capabilities of
existing classes and adding appropriate new capabilities. In the context of an
Employee hierarchy case study, this
chapter presents a five-example sequence demonstrating private data,
protected data and good software
engineering with inheritance. The chapter discusses the notions of base classes
and derived classes, protected members, public inheritance,
protected inheritance, private
inheritance, direct base classes, indirect base classes, constructors and
destructors in base classes and derived classes, and software engineering with
inheritance. The chapter also compares inheritance (the is-a relationship) with composition (the has-a relationship) and introduces the uses-a and knows-a
relationships.
Chapter
13, Object-Oriented Programming: Polymorphism, deals with another
fundamental capability of object-oriented programming: polymorphic behavior. Chapter
13 builds on the inheritance concepts presented in Chapter
12 and focuses on the relationships among
classes in a class hierarchy and the powerful processing capabilities that these
relationships enable. When many classes are related to a common base class
through inheritance, each derived-class object may be treated as a base-class
object. This enables programs to be written in a simple and general manner
independent of the specific types of the derived-class objects. New kinds of
objects can be handled by the same program, thus making systems more extensible.
The chapter discusses the mechanics of achieving polymorphic behavior via
virtual functions. It distinguishes
between abstract classes (from which objects cannot be instantiated) and
concrete classes (from which objects can be instantiated). Abstract classes are
useful for providing an inheritable interface to classes throughout the
hierarchy. We include an illustration and a precise explanation of the vtables (virtual
function tables) that the C++ compiler builds automatically to support
polymorphism. To conclude, we introduce run-time type information (RTTI) and
dynamic casting, which enable a program to determine an object's type at
execution time, then act on that object accordingly.
Chapter
14, Templates, discusses one of C++'s
more powerful software reuse features, namely templates. Function templates and
class templates enable you to specify, with a single code segment, an entire
range of related overloaded functions (called function template specializations)
or an entire range of related classes (called class-template specializations).
This technique is called generic programming. We might write a single class
template for a stack class, then have C++ generate separate class-template
specializations, such as a "stack-of-int" class, a
"stack-of-float" class, a "stack-of-string" class and so on. The chapter discusses using type parameters,
nontype parameters and default types for class templates. We also discuss the
relationships between templates and other C++ features, such as overloading,
inheritance, friends and static members. We
greatly enhance the treatment of templates in our discussion of the Standard
Template Library (STL) containers, iterators and algorithms in Chapter
20.
Chapter
15, Stream Input/Output, contains a
comprehensive treatment of standard C++ input/output capabilities. This chapter
discusses a range of capabilities sufficient for performing most common I/O
operations and overviews the remaining capabilities. Many of the I/O features
are object oriented. The various I/O capabilities of C++, including output with
the stream insertion operator, input with the stream extraction operator,
type-safe I/O, formatted I/O, unformatted I/O (for performance). Users can
specify how to perform I/O for objects of user-defined types by overloading the
stream insertion operator (<<) and the stream extraction operator
(>>). C++ provides various stream
manipulators that perform formatting tasks. This chapter discusses stream
manipulators that provide capabilities such as displaying integers in various
bases, controlling floating-point precision, setting field widths, displaying
decimal point and trailing zeros, justifying output, setting and unsetting
format state, setting the fill character in fields. We also present an example
that creates user-defined output stream manipulators.
Chapter
16, Exception Handling, discusses how
exception handling enables you to write programs that are robust, fault tolerant
and appropriate for business-critical and mission-critical environments. The
chapter discusses when exception handling is appropriate; introduces the basic
capabilities of exception handling with try blocks, throw
statements and catch handlers; indicates how and
when to rethrow an exception; explains how to write an exception specification
and process unexpected exceptions; and discusses the important ties between
exceptions and constructors, destructors and inheritance. We discuss rethrowing
an exception, and illustrate how new can fail
when memory is exhausted. Many older C++ compilers return 0 by default when
new fails. We show the new style of
new failing by throwing a bad_alloc (bad allocation) exception. We illustrate how to use function
set_new_handler to specify a custom
function to be called to deal with memory-exhaustion situations. We discuss how
to use the auto_ptr class template to delete dynamically allocated memory implicitly, thus avoiding
memory leaks. To conclude this chapter, we present the Standard Library
exception hierarchy.
Chapter
17, File Processing, discusses
techniques for creating and processing both sequential files and random-access
files. The chapter begins with an introduction to the data hierarchy from bits,
to bytes, to fields, to records and to files. Next, we present the C++ view of
files and streams. We discuss sequential files and build programs that show how
to open and close files, how to store data sequentially in a file and how to
read data sequentially from a file. We then discuss random-access files and
build programs that show how to create a file for random access, how to read and
write data to a file with random access and how to read data sequentially from a
randomly accessed file. The case study combines the techniques of accessing
files both sequentially and randomly into a complete transaction-processing
program.
Chapter
18, Class string and String Stream Processing, The chapter discusses C++'s capabilities for
inputting data from strings in memory and outputting data to strings in memory;
these capabilities often are referred to as in-core formatting or string stream
processing. Class string is a required
component of the Standard Library. We preserved the treatment of C-like,
pointer-based strings in Chapter
8 and later for several reasons. First, it
strengthens your understanding of pointers. Second, for the next decade or so,
C++ programmers will need to be able to read and modify the enormous amounts of
C legacy code that has accumulated over the last quarter of a century—this code
processes strings as pointers, as does a large portion of the C++ code that has
been written in industry over the last many years. In Chapter
18 we discuss string assignment,
concatenation and comparison. We show how to determine various string characteristics such as a string's
size, capacity and whether or not it is empty. We discuss how to resize a
string. We consider the various "find" functions
that enable us to find a substring in a string (searching the
string either forwards or backwards), and we
show how to find either the first occurrence or last occurrence of a character
selected from a string of characters, and
how to find the first occurrence or last occurrence of a character that is not
in a selected string of characters. We show
how to replace, erase and insert characters in a string and how to
convert a string object to a C-style char * string.
Chapter
19, Bits, Characters, C Strings and structs, begins by comparing C++ structures to classes, then
defining and using C-like structures. We show how to declare structures,
initialize structures and pass structures to functions. C++'s powerful
bit-manipulation capabilities enable you to write programs that exercise
lower-level hardware capabilities. This helps programs process bit strings, set
individual bits and store information more compactly. Such capabilities, often
found only in low-level assembly languages, are valued by programmers writing
system software, such as operating systems and networking software. We discuss
C-style char * string manipulation in Chapter
8, where we present the most popular
string-manipulation functions. In Chapter
19, we continue our presentation of characters
and C-style char * strings. We present the
various character-manipulation capabilities of the <cctype> library—such as the ability to test a character to determine
whether it is a digit, an alphabetic character, an alphanumeric character, a
hexadecimal digit, a lowercase letter or an uppercase letter. We present the
remaining string-manipulation functions of the various string-related
libraries.
Chapter
20, Standard Template Library (STL),
discusses the STL's powerful, template-based, reusable components that implement
many common data structures and algorithms used to process those data
structures. The STL offers proof of concept for generic programming with
templates—introduced in Chapter
14. This chapter discusses the STL's three key
components—containers (templatized data structures), iterators and algorithms.
Containers are data structures capable of storing objects of any type. We'll see
that there are three container categories—first-class containers, adapters and
near containers. Iterators, which have similar properties to those of pointers,
are used by programs to manipulate the container elements. In fact, standard
arrays can be manipulated as STL containers, using pointers as iterators.
Manipulating containers with iterators is convenient and provides tremendous
expressive power when combined with STL algorithms—in some cases, reducing many
lines of code to a single statement. STL algorithms are functions that perform
common data manipulations such as searching, sorting and comparing elements (or
entire containers). Most of these use iterators to access container
elements.
Chapter
21, Boost Libraries, Technical Report 1 and C++0x,
focuses on the future of C++. We introduce the Boost Libraries, a collection of
free, open source C++ libraries. The Boost libraries are carefully designed to
work well with the C++ Standard Library. We then discuss Technical Report 1
(TR1), a description of proposed changes and additions to the Standard Library.
Many of the libraries in TR1 were derived from libraries currently in Boost. The
chapter briefly describes the TR1 libraries. We provide in-depth code examples
for two of the most useful libraries, Boost.Regex and
Boost.Smart_ptr. The Boost.Regex library
provides support for regular expressions. We demonstrate how to use the library
to search a string for matches to a regular expression, validate data, replace
parts of a string and split a string into tokens. The Boost.Smart_ptr library provides smart pointers to help manage
dynamically allocated memory. We discuss the two types of smart pointers
included in TR1—shared_ptr and weak_ptr. We provide examples to demonstrate how these can be
used to avoid common memory management errors. This chapter also discusses the
upcoming release of the new standard for C++.
Chapter
22, Other Topics, is a collection of
miscellaneous C++ topics. We discuss one more cast operator—const_cast.
This operator, static_cast (Chapter
5), dynamic_cast (Chapter
13) and reinterpret_cast (Chapter
17), provide a more robust mechanism for
converting between types than do the original cast operators C++ inherited from
C (which are now deprecated). We discuss namespaces, a feature particularly
crucial for software developers who build substantial systems. Namespaces
prevent naming collisions, which can hinder such large software efforts. We
discuss keyword mutable, which allows a member
of a const object to be changed. Previously, this was accomplished by
"casting away const-ness", which is considered a dangerous practice. We
also discuss pointer-to-member operators .* and ->*,
multiple inheritance (including the problem of "diamond inheritance") and
virtual base classes.
Appendix
A, Operator Precedence and Associativity Chart, presents the complete set of C++ operator symbols, in
which each operator appears on a line by itself with its operator symbol, its
name and its associativity.
Appendix
B, ASCII Character Set. All the programs in
this book use the ASCII character set, which is presented in this appendix.
Appendix
C, Fundamental Types, lists C++'s fundamental types.
Appendix
D, Preprocessor, discusses the
preprocessor's directives. The appendix includes more complete information on
the #include directive, which causes a copy
of a specified file to be included in place of the directive before the file is
compiled and the #define directive that
creates symbolic constants and macros. The appendix explains conditional
compilation, which enables you to control the execution of preprocessor
directives and the compilation of program code. The # operator that converts its operand to a string and the
## operator that concatenates two tokens are
discussed. The various predefined preprocessor symbolic constants
(__LINE__, __FILE__, __DATE__, __STDC__,
__TIME__ and __TIMESTAMP__) are presented. Finally, macro
assert of the header file
<cassert> is discussed, which is
valuable in program testing, debugging, verification and validation.
Appendix
E, ATM Case Study Code, contains the
implementation of our case study on object-oriented design with the UML. This
appendix is discussed in the tour of the case study (presented shortly).
Appendix
F, UML 2: Additional Diagram Types, overviews
the UML 2 diagram types that are not found in the OOD/UML Case Study.
Appendix
G, Using the Visual Studio Debugger,
demonstrates key features of the Visual Studio Debugger, which allows a
programmer to monitor the execution of applications to locate and remove logic
errors. The appendix presents step-by-step instructions, so you learn how to use
the debugger in a hands-on manner.
Appendix
H, Using the GNU C++ Debugger, demonstrates
key features of the GNU C++ Debugger. The appendix presents step-by-step
instructions, so you learn how to use the debugger in a hands-on manner.
Bibliography. The Bibliography lists many books and articles for
further reading on C++ and object-oriented programming.
Index. The comprehensive index enables you to locate by
keyword any term or concept throughout the text.
Object-Oriented Design of an ATM with the
UML: A Tour of the Optional Software Engineering Case Study
In this section, we tour the book's
optional case study of object-oriented design with the UML. This tour previews
the contents of the nine Software Engineering Case Study sections (in Chapters
1–7,
9
and 13). After completing this case study, you'll be thoroughly
familiar with a carefully developed and reviewed object-oriented design and
implementation for a significant C++ application.
The design presented in the ATM case study
was developed at Deitel & Associates, Inc. and scrutinized by a
distinguished developmental review team of industry professionals and academics.
Real ATM systems used by banks and their customers worldwide are based on more
sophisticated designs that take into consideration many more issues than we have
addressed here. Our primary goal throughout the design process was to create a
simple design that would be clear to OOD and UML novices, while still
demonstrating key OOD concepts and the related UML modeling techniques.
Section
1.10, Software Engineering Case Study: Introduction to Object Technology and
the UML—introduces the object-oriented design
case study with the UML. The section introduces the basic concepts and
terminology of object technology, including classes, objects, encapsulation,
inheritance and polymorphism. We discuss the history of the UML. This is the
only required section of the case study.
Section
2.7, (Optional) Software Engineering Case Study: Examining the ATM
Requirements Specification—discusses a requirements specification that
specifies the requirements for a system that we'll design and implement—the
software for a simple automated teller machine (ATM). We investigate the
structure and behavior of object-oriented systems in general. We discuss how the
UML will facilitate the design process in subsequent Software Engineering Case
Study sections by providing several additional types of diagrams to model our
system. We discuss the interaction between the ATM system specified by the
requirements specification and its user. Specifically, we investigate the
scenarios that may occur between the user and the system itself—these are called
use cases. We model these interactions, using
use case diagrams of the UML.
Section
3.11, (Optional) Software Engineering Case Study:
Identifying the Classes in the ATM Requirements Specification— begins to design the ATM system. We identify its
classes, or "building blocks," by extracting the nouns and noun phrases from the
requirements specification. We arrange these classes into a UML class diagram
that describes the class structure of our simulation. The class diagram also
describes relationships, known as associations, among classes.
Section
4.11, (Optional) Software Engineering Case
Study: Identifying Class Attributes in the ATM System— focuses on the attributes of the classes discussed in
Section
3.11. A class contains both attributes (data) and operations (behaviors). As
we'll see in later sections, changes in an object's attributes often affect the
object's behavior. To determine the attributes for the classes in our case
study, we extract the adjectives describing the nouns and noun phrases (which
defined our classes) from the requirements specification, then place the
attributes in the class diagram we created in Section
3.11.
Section
5.10, (Optional) Software Engineering Case Study: Identifying Objects'
States and Activities in the ATM System— discusses
how an object, at any given time, occupies a specific condition called a state. A state
transition occurs when that object receives a
message to change state. The UML provides the state
machine diagram, which identifies the set of
possible states that an object may occupy and models that object's state
transitions. An object also has an activity—the
work it performs in its lifetime. The UML provides the activity diagram—a flowchart
that models an object's activity. In this section, we use both types of diagrams
to begin modeling specific behavioral aspects of our ATM system, such as how the
ATM carries out a withdrawal transaction and how the ATM responds when the user
is authenticated.
Section
6.22, (Optional) Software Engineering
Case Study: Identifying Class Operations in the ATM System— identifies the operations, or services, of our classes. We
extract from the requirements specification the verbs and verb phrases that
specify the operations for each class. We then modify the class diagram of Section
3.11 to include each operation with its
associated class. At this point in the case study, we will have gathered all
information possible from the requirements specification. However, as future
chapters introduce such topics as inheritance, we'll modify our classes and
diagrams.
Section
7.12, (Optional) Software Engineering Case Study:
Collaboration Among Objects in the ATM System—
provides a "rough sketch" of the model for our ATM system. In this section, we
see how it works. We investigate the behavior of the simulation by discussing
collaborations—messages
that objects send to each other to communicate. The class operations that we
discovered in Section
6.22 turn out to be the collaborations among the
objects in our system. We determine the collaborations, then collect them into a
communication diagram—the UML diagram for modeling collaborations. This
diagram reveals which objects collaborate and when. We present a communication
diagram of the collaborations among objects to perform an ATM balance inquiry.
We then present the UML sequence diagram for modeling interactions in a system. This diagram
emphasizes the chronological ordering of messages. A sequence diagram models how
objects in the system interact to carry out withdrawal and deposit
transactions.
Section
9.11, (Optional) Software Engineering
Case Study: Starting to Program the Classes of the ATM System— takes a break from designing the system's behavior.
We begin the implementation process to emphasize the material discussed in Chapter
9. Using the UML class diagram of Section
3.11 and the attributes and operations
discussed in Section
4.11 and Section
6.22, we show how to implement a class in C++
from a design. We do not implement all classes—because we have not completed the
design process. Working from our UML diagrams, we create code for the
Withdrawal class.
Section
13.10, (Optional) Software Engineering Case Study: Incorporating Inheritance
into the ATM System— continues our
discussion of object-oriented programming. We consider inheritance—classes
sharing common characteristics may inherit attributes and operations from a
"base" class. In this section, we investigate how our ATM system can benefit
from using inheritance. We document our discoveries in a class diagram that
models inheritance relationships—the UML refers to these relationships as generalizations. We modify the class diagram of Section
3.11 by using inheritance to group
classes with similar characteristics. This section concludes the design of the
model portion of our simulation. We fully implement this model in 877 lines of
C++ code in Appendix
E.
Appendix
E, ATM Case Study Code— The majority of the
case study involves designing the model (i.e., the data and logic) of the ATM
system. In this appendix, we implement that model in C++. Using all the UML
diagrams we created, we present the C++ classes necessary to implement the
model. We apply the concepts of object-oriented design with the UML and
object-oriented programming in C++ that you learned in the chapters. By the end
of this appendix, you'll have completed the design and implementation of a
real-world system, and should feel confident tackling larger systems.
Appendix
F, UML 2: Additional Diagram Types— Overviews
the UML 2 diagram types that are not found in the OOD/UML Case Study.
Compilers and Other Resources
Many C++ development tools are available.
We wrote C++ for Programmers primarily using Microsoft's free Visual C++ Express Edition
(www.microsoft.com/express/vc/) and the
free GNU C++ at gcc.gnu.org, which is already
installed on most Linux systems and can be installed on Mac OS X systems as
well. Apple includes GNU C++ in their Xcode development tools, which Max OS X
users can download from developer.apple.com/tools/xcode.
Additional resources and
software downloads are available in our C++ Resource Center:
www.deitel.com/cplusplus/
and at the website for this book:
www.deitel.com/books/cppfp/
For a list of other C++ compilers
that are available free for download, visit:
www.thefreecountry.com/developercity/ccompilers.shtml
www.compilers.net
Warnings and Error Messages on
Older C++ Compilers
The programs in this book are designed to
be used with compilers that support standard C++. However, there are variations
among compilers that may cause occasional warnings or errors. In addition,
though the standard specifies various situations that require errors to be
generated, it does not specify the messages that compilers should issue.
Warnings and error messages vary among compilers.
Some older C++ compilers generate error
or warning messages in places where newer compilers do not. Although most of the
examples in this book will work with these older compilers, there are a few
examples that need minor modifications to work with older compilers.
Notes Regarding using Declarations and C Standard Library
Functions
The C++ Standard Library includes
the functions from the C Standard Library. According to the C++ standard
document, the contents of the header files that come from the C Standard Library
are part of the "std" namespace. Some
compilers (old and new) generate error messages when using declarations are encountered for C functions.
The Deitel Online Resource
Centers
Our website provides Resource
Centers (www.deitel.com/ResourceCenters.html) on various topics including programming languages,
software, Web 2.0, Internet business and open source projects. The Resource
Centers evolve out of the research we do for our books and business endeavors.
We've found many (mostly free) exceptional resources including tutorials,
documentation, software downloads, articles, blogs, videos, code samples, books,
e-books and more. We help you wade through the vast amount of content on the
Internet by providing links to the most valuable resources. Each week we
announce our latest Resource Centers in our newsletter, the Deitel® Buzz Online (www.deitel.com/newsletter/subscribe.html). The following Resource Centers may be of interest to
you as you read C++ for Programmers:
Deitel® Buzz Online Free E-mail
Newsletter
Each week, the Deitel® Buzz
Online newsletter announces our latest
Resource Centers and includes commentary on industry trends and developments,
links to free articles and resources from our published books and upcoming
publications, product-release schedules, errata, challenges, anecdotes,
information on our corporate instructor-led training courses and more. It's also
a good way for you to keep posted about issues related to C++ for Programmers. To subscribe, visit
www.deitel.com/newsletter/subscribe.html
Deitel® LiveLessons Self-Paced Video Training
The Deitel® LiveLessons products are
self-paced video training. Each collection provides approximately 14+ hours of
an instructor guiding you through programming training.
Your instructor, Paul Deitel,
has personally taught programming at organizations ranging from IBM to Sun
Microsystems to NASA. With the powerful videos included in our LiveLessons
products, you'll learn at your own pace as Paul guides you through programming
fundamentals, object-oriented programming and additional topics.
Deitel® LiveLessons products are based on its corresponding best-selling
books and Paul's extensive experience presenting hundreds corporate training
seminars. To view sample videos, visit
www.deitel.com/books/livelessons/
The Java
Fundamentals I and II LiveLessons are
available now. For announcements about upcoming Deitel LiveLessons products, including C++ Fundamentals, C# 2008
Fundamentals and JavaScript Fundamentals, subscribe to the Deitel® Buzz
Online email newsletter at www.deitel.com/newsletter/subscribe.html.
Deitel® Dive-Into® Series Instructor-Led
Training
With our corporate, on-site, instructor-led Dive-Into® Series programming training courses (Fig. 2),
professionals can learn C++, Java, C, Visual Basic, Visual C#, Visual C++,
Python, and Internet and web programming from the internationally recognized
professionals at Deitel & Associates, Inc. Our authors, teaching staff and
contract instructors have taught over 1,000,000 people in more than 100
countries how to program in almost every major programming language through:
-
Deitel Developer Series
professional books
-
How to Program Series
textbooks
-
University teaching
-
Professional seminars
-
Interactive multimedia CD-ROM Cyber Classrooms, Complete
Training Courses and LiveLessons Video
Training
-
Satellite broadcasts
Fig. 2. Deitel Dive
Into® Series programming training courses.
| Deitel Dive Into® Series
Programming Training Courses |
| Java |
Intro to Java for Non-Programmers:
Part 1
Intro to Java for Non-Programmers: Part 2
Java for Visual
Basic, C or COBOL Programmers
Java for C++ or C# Programmers
Advanced Java |
| C++ |
Intro to C++ for Non-Programmers:
Part 1
Intro to C++ for Non-Programmers: Part 2
C++ and Object
Oriented Programming |
| C |
Intro to C for Non-Programmers:
Part 1
Intro to C for Non-Programmers: Part 2
C for
Programmers |
| Visual C# 2008 |
Intro to Visual C# 2008 for
Non-Programmers: Part 1
Intro to Visual C# 2008 for Non-Programmers:
Part 2
Visual C# 2008 for Visual Basic, C or COBOL Programmers
Visual C# 2008 for Java or C++ Programmers
Advanced Visual C#
2008 |
Visual Basic 2008
Intro to Visual Basic
2008 for Non-Programmers: Part 1
Intro to Visual Basic 2008 for
Non-Programmers: Part 2
Visual Basic 2008 for VB6, C or COBOL
Programmers
Visual Basic 2008 for Java, C# or C++ Programmers
Advanced Visual Basic 2008 |
| Visual C++ 2008 |
Intro to Visual C++ 2008 for
Non-Programmers: Part 1
Intro to Visual C++ 2008 for Non-Programmers:
Part 2
Visual C++ 2008 and Object Oriented Programming |
Internet and Web Programming
Client-Side
Internet and Web Programming
Rich Internet Application (RIA) Development
Server-Side Internet and Web
Programming |
We're uniquely qualified to turn
non-programmers into programmers and to help professional programmers move to
new programming languages. For more information about our on-site,
instructor-led Dive-Into® Series
programming training, visit
www.deitel.com/training/
Acknowledgments
It is a great pleasure to acknowledge
the efforts of many people whose names may not appear on the cover, but whose
hard work, cooperation, friendship and understanding were crucial to the
production of the book. Many people at Deitel & Associates, Inc. devoted
long hours to this project—thanks especially to Abbey Deitel and Barbara
Deitel.
We'd also like to thank one of the
participants in our Honors Internship program who contributed to this
publication—Greg Ayer, a computer science major at Northeastern University.
We are fortunate to have worked on
this project with the talented and dedicated team of publishing professionals at
Prentice Hall. We appreciate the extraordinary efforts of Marcia Horton,
Editorial Director of Prentice Hall's Engineering and Computer Science Division,
Mark Taub, Editor-in-Chief of Prentice Hall Professional, and John Fuller,
Managing Editor of Prentice Hall Professional. Carole Snyder, Lisa Bailey and
Dolores Mars did a remarkable job recruiting the book's large review team and
managing the review process. Sandra Schroeder designed the book's cover. Scott
Disanno and Robert Engelhardt managed the book's production.
This book was adapted from our book
C++ How to Program, 6/e. We wish to
acknowledge the efforts of our reviewers on that book. Adhering to a tight time
schedule, they scrutinized the text and the programs, providing countless
suggestions for improving the accuracy and completeness of the
presentation.
C++ How to Program, 6/e Reviewers
Industry and Academic
Reviewers: Dr. Richard Albright (Goldey-Beacom
College), William B. Higdon (University of Indianapolis), Howard Hinnant
(Apple), Anne B. Horton (Lockheed Martin), Terrell Hull (Logicalis Integration
Solutions), Rex Jaeschke (Independent Consultant), Maria Jump (The University of
Texas at Austin), Geoffrey S. Knauth (GNU), Don Kostuch (Independent
Consultant), Colin Laplace (Freelance Software Consultant), Stephan T. Lavavej
(Microsoft), Amar Raheja (California State Polytechnic University, Pomona), G.
Anthony Reina (University of Maryland University College, Europe), Daveed
Vandevoorde (C++ Standards Committee), Jeffrey Wiener (DEKA Research &
Development Corporation, New Hampshire Community Technical College), and Chad
Willwerth (University of Washington, Tacoma). Boost/C++Ox Reviewers:
Edward Brey (Kohler Co.), Jeff Garland (Boost.org), Douglas Gregor (Indiana
University), and Björn Karlsson (Author of Beyond the C++ Standard Library: An Introduction to
Boost, Addison-Wesley/Readsoft, Inc.).
These reviewers scrutinized
every aspect of the text and made countless suggestions for improving the
accuracy and completeness of the presentation.
Well, there you have it! Welcome to the
exciting world of C++ and object-oriented programming. We hope you enjoy this
look at contemporary computer programming.
As you read the book, we would sincerely
appreciate your comments, criticisms, corrections and suggestions for improving
the text. Please address all correspondence to:
deitel@deitel.com
We'll respond promptly, and post corrections and clarifications
on:
www.deitel.com/books/cppfp/
We hope you enjoy reading C++ for
Programmers as much as we enjoyed writing it!
Paul J. Deitel
Dr. Harvey M. Deitel
About the Authors
Paul J. Deitel, CEO and Chief Technical Officer of Deitel & Associates,
Inc., is a graduate of MIT's Sloan School of Management, where he studied
Information Technology. Through Deitel & Associates, Inc., he has delivered
C++, Java, C, C# and Visual Basic courses to industry, government and military
clients, including Cisco, IBM, Sun Microsystems, Dell, Lucent Technologies,
Fidelity, NASA at the Kennedy Space Center, White Sands Missile Range, the
National Severe Storm Laboratory, Rogue Wave Software, Boeing, Stratus, Hyperion
Software, Adra Systems, Entergy, CableData Systems, Nortel Networks, Puma,
iRobot, Invensys and many more. He has lectured on C++ and Java for the Boston
Chapter of the Association for Computing Machinery, and on .NET technologies for
ITESM in Monterrey, Mexico. He and his father, Dr. Harvey M. Deitel, are the
world's best-selling programming language textbook authors.
Dr. Harvey M.
Deitel, Chairman and Chief Strategy
Officer of Deitel & Associates, Inc., has 47 years of academic and industry
experience in the computer field. Dr. Deitel earned B.S. and M.S. degrees from
the MIT and a Ph.D. from Boston University. He has 20 years of college teaching
experience, including earning tenure and serving as the Chairman of the Computer
Science Department at Boston College before founding Deitel & Associates,
Inc., with his son, Paul J. Deitel. He and Paul are the co-authors of several
dozen books and multimedia packages and they are writing many more. The Deitels'
texts have earned international recognition with translations published in
Japanese, German, Russian, Spanish, Traditional Chinese, Simplified Chinese,
Korean, French, Polish, Italian, Portuguese, Greek, Urdu and Turkish. Dr. Deitel
has delivered hundreds of professional seminars to major corporations, academic
institutions, government organizations and the military.
About Deitel & Associates,
Inc
Deitel &
Associates, Inc., is an internationally recognized corporate training and
content-creation organization specializing in computer programming languages,
Internet and web software technology, object technology education and Internet
business development through its Internet Business Initiative. The company
provides instructor-led professional courses on major programming languages and
platforms, such as C++, Java, C, C#, Visual C++, Visual Basic, XML, Perl,
Python, object technology and Internet and web programming. The founders of
Deitel & Associates, Inc., are Paul J. Deitel and Dr. Harvey M. De-itel. The
company's clients include many of the world's largest companies, government
agencies, branches of the military, and academic institutions. Through its
32-year publishing partnership with Prentice Hall, Deitel & Associates, Inc.
publishes leading-edge programming professional books, textbooks, LiveLessons video courses,
interactive multimedia Cyber Classrooms, web-based training courses and e-content for popular
course management systems. Deitel & Associates, Inc., and the authors can be
reached via e-mail at:
deitel@deitel.com
To learn more about Deitel & Associates, Inc., its
publications and its Dive-Into® Series
Corporate Training curriculum offered on-site at clients worldwide, visit:
www.deitel.com
and subscribe to the free Deitel® Buzz
Online e-mail newsletter at:
www.deitel.com/newsletter/subscribe.html
Check out the growing list of online Deitel Resource Centers
at:
www.deitel.com/resourcecenters.html
Individuals wishing to purchase Deitel publications can do so
through:
www.deitel.com/books/index.html
Bulk orders by corporations, the
government, the military and academic institutions should be placed directly
with Prentice Hall. For more information, visit
www.prenhall.com/mischtm/support.html#order