Like any human language, C++
provides a way to express concepts. If successful, this medium of expression
will be significantly easier and more flexible than the alternatives as problems
grow larger and more complex.
You can’t just look at C++ as a
collection of features; some of the features make no sense in isolation. You can
only use the sum of the parts if you are thinking about design, not
simply coding. And to understand C++ this way, you must understand the problems
with C and with programming in general. This book discusses programming
problems, why they are problems, and the approach C++ has taken to solve such
problems. Thus, the set of features I explain in each chapter will be based on
the way that I see a particular type of problem being solved with the language.
In this way I hope to move you, a little at a time, from understanding C to the
point where the C++ mindset becomes your native tongue.
Throughout, I’ll be taking the
attitude that you want to build a model in your head that allows you to
understand the language all the way down to the bare metal; if you encounter a
puzzle, you’ll be able to feed it to your model and deduce the answer. I
will try to convey to you the insights that have rearranged my brain to make me
start “thinking in
C++.”
This book is a thorough rewrite of the
first edition to reflect all of the changes introduced in C++ by the
finalization of the C++ Standard, and also to reflect what I’ve learned
since writing the first edition. The entire text present in the first edition
has been examined and rewritten, sometimes removing old examples, often changing
existing examples and adding new ones, and adding many new exercises.
Significant rearrangement and re-ordering of the material took place to reflect
the availability of better tools and my improved understanding of how people
learn C++. A new chapter was added which is a rapid introduction to the
C concepts and basic C++ features for those who don’t
have the C background to tackle the rest of the book. The
CD ROM bound into the back of the book contains a seminar
that is an even gentler introduction to the C concepts necessary to understand
C++ (or Java). It was created by Chuck Allison for my
company (MindView, Inc.), and it’s called
“Thinking in C: Foundations for Java and C++.”
It introduces you to the aspects of C that are necessary for you to move on to
C++ or Java, leaving out the nasty bits that C programmers must deal with on a
day-to-day basis but that the C++ and Java languages steer
you away from (or even eliminate, in the case of Java).
So the short answer to the question
“what’s different in the 2nd edition?” is: what
isn’t brand new has been rewritten, sometimes to the point where you
wouldn’t recognize the original examples and
material.
The completion of the C++ Standard also
added a number of important new libraries, such as string and the
containers and algorithms in the Standard C++ Library, as well as new complexity
in templates. These and other more advanced topics have been relegated to
Volume 2 of this book, including
issues such as multiple inheritance, exception handling, design patterns, and
topics about building and debugging stable
systems.
Just like the book you currently hold,
Thinking in C++, Volume 2 is downloadable in its entirety from my Web
site at www.BruceEckel.com. You can find information on the Web site
about the expected print date of Volume 2.
The Web site also contains the source
code for both of the books, along with updates and information about other
seminars-on-CD ROM that MindView, Inc. offers, public seminars, and in-house
training, consulting, mentoring, and
walkthroughs.
In the first edition of this book, I
decided to assume that someone else had taught you C and that you have at least
a reading level of comfort with it. My primary focus was on simplifying what I
found difficult: the C++ language. In this edition I have added a chapter that
is a rapid introduction to C, along with the Thinking in C seminar-on-CD,
but I am still assuming that you already have some kind of programming
experience. In addition, just as you learn many new words intuitively by seeing
them in context in a novel, it’s possible to learn a great deal about C
from the context in which it is used in the rest of the
book.
I clawed my way into C++ from exactly the
same position I expect many of the readers of this book are in: as a programmer
with a very no-nonsense, nuts-and-bolts attitude about programming. Worse, my
background and experience was in hardware-level embedded programming, in which C
has often been considered a high-level language and an inefficient overkill for
pushing bits around. I discovered later that I wasn’t even a very good C
programmer, hiding my ignorance of structures, malloc( ) and
free( ), setjmp( ) and longjmp( ), and other
“sophisticated” concepts, scuttling away in shame when the subjects
came up in conversation instead of reaching out for new
knowledge.
When I began my struggle to understand
C++, the only decent book was Bjarne Stroustrup’s
self-professed “expert’s
guide,[1]”
so I was left to simplify the basic concepts on my own. This resulted in my
first C++ book,[2]
which was essentially a brain dump of my experience. That was designed as a
reader’s guide to bring programmers into C and C++ at the same time. Both
editions[3] of the
book garnered enthusiastic response.
At about the same time that Using
C++ came out, I began teaching the language in seminars and presentations.
Teaching C++ (and later, Java) became my profession; I’ve seen nodding
heads, blank faces, and puzzled expressions in audiences all over the world
since 1989. As I began giving in-house training to smaller groups of people, I
discovered something during the exercises. Even those people who were smiling
and nodding were confused about many issues. I found out, by creating and
chairing the C++ and Java tracks at the Software Development Conference for many
years, that I and other speakers tended to give the typical audience too many
topics, too fast. So eventually, through both variety in the audience level and
the way that I presented the material, I would end up losing some portion of the
audience. Maybe it’s asking too much, but because I am one of those people
resistant to traditional lecturing (and for most people, I believe, such
resistance results from boredom), I wanted to try to keep everyone up to
speed.
For a time, I was creating a number of
different presentations in fairly short order. Thus, I ended up learning by
experiment and iteration (a technique that also works well in C++ program
design). Eventually I developed a course using everything I had learned from my
teaching experience. It tackles the learning problem in discrete, easy-to-digest
steps and for a hands-on seminar (the ideal learning situation) there are
exercises following each of the presentations. You can find out about my
public seminars at
www.BruceEckel.com, and you can also learn about the seminars that
I’ve turned into CD ROMs.
The first edition of this book developed
over the course of two years, and the material in this book has been road-tested
in many forms in many different seminars. The feedback that I’ve gotten
from each seminar has helped me change and refocus the material until I feel it
works well as a teaching medium. But it isn’t just a seminar handout; I
tried to pack as much information as I could within these pages, and structure
it to draw you through onto the next subject. More than anything, the book is
designed to serve the solitary reader who is struggling with a new programming
language.
My goals in this book are
to:
C++ is a language in which new and
different features are built on top of an existing syntax. (Because of this, it
is referred to as a
hybrid
object-oriented programming language.) As more people pass through the learning
curve, we’ve begun to get a feel for the way programmers move through the
stages of the C++ language features. Because it appears to be the natural
progression of the procedurally-trained mind, I decided to understand and follow
this same path and accelerate the process by posing and answering the questions
that came to me as I learned the language and those questions that came from
audiences as I taught the language.
This course was designed with one thing
in mind: to streamline the process of learning C++. Audience feedback helped me
understand which parts were difficult and needed extra illumination. In the
areas in which I got ambitious and included too many features all at once, I
came to know – through the process of presenting the material – that
if you include a lot of new features, you have to explain them all, and the
student’s confusion is easily compounded. As a result, I’ve taken a
great deal of trouble to introduce the features as few at a time as possible;
ideally, only one major concept at a time per chapter.
The goal, then, is for each chapter to
teach a single concept, or a small group of associated concepts, in such a way
that no additional features are relied upon. That way you can digest each piece
in the context of your current knowledge before moving on. To accomplish this, I
leave some C features in place for longer than I would prefer. The benefit is
that you will not be confused by seeing all the C++ features used before they
are explained, so your introduction to the language will be gentle and will
mirror the way you will assimilate the features if left to your own
devices.
Here is a brief description of the
chapters contained in this book:
Chapter 1: Introduction to
Objects. When projects became too big and complicated to easily maintain,
the “software crisis”
was born, with programmers saying, “We can’t get projects done, and
if we can, they’re too expensive!” This precipitated a number of
responses, which are discussed in this chapter along with the ideas of
object-oriented programming (OOP) and how it attempts to solve the software
crisis. The chapter walks you through the basic concepts and features of OOP and
also introduces the analysis and design process. In addition, you’ll learn
about the benefits and concerns of adopting the language and suggestions for
moving into the world of C++.
Chapter 2: Making and Using
Objects. This chapter explains the process of building programs using
compilers and libraries. It introduces the first C++ program in the book and
shows how programs are constructed and compiled. Then some of the basic
libraries of objects available in Standard C++ are introduced. By the time you
finish this chapter you’ll have a good grasp of what it means to write a
C++ program using off-the-shelf object libraries.
Chapter 3: The C in C++. This
chapter is a dense overview of the features in C that are used in C++, as well
as a number of basic features that are available only in C++. It also introduces
the “make” utility that’s common in the software development
world and that is used to build all the examples in this book (the source code
for the book, which is available at www.BruceEckel.com, contains
makefiles for each chapter). Chapter 3 assumes that you have a solid grounding
in some procedural programming language like Pascal, C, or even some flavors of
Basic (as long as you’ve written plenty of code in that language,
especially functions). If you find this chapter a bit too much, you should first
go through the Thinking in C seminar on the CD that’s bound with
this book (and also available at www.BruceEckel.com).
Chapter 4: Data Abstraction. Most
features in C++ revolve around the ability to create new data types. Not only
does this provide superior code organization, but it lays the groundwork for
more powerful OOP abilities. You’ll see how this idea is facilitated by
the simple act of putting functions inside structures, the details of how to do
it, and what kind of code it creates. You’ll also learn the best way to
organize your code into header files and implementation files.
Chapter 5: Hiding the
Implementation. You can decide that some of the data and functions in
your structure are unavailable to the user of the new type by making them
private. This means that you can separate the underlying implementation
from the interface that the client programmer sees, and thus allow that
implementation to be easily changed without affecting client code. The keyword
class is also introduced as a fancier way to describe a new data type,
and the meaning of the word “object” is demystified (it’s a
fancy variable).
Chapter 6: Initialization and
Cleanup. One of the most common C errors results from uninitialized
variables. The constructor in C++ allows you to guarantee that variables
of your new data type (“objects of your class”) will always be
initialized properly. If your objects also require some sort of cleanup, you can
guarantee that this cleanup will always happen with the C++
destructor.
Chapter 7: Function Overloading and
Default Arguments. C++ is intended to help you build big, complex
projects. While doing this, you may bring in multiple libraries that use the
same function name, and you may also choose to use the same name with different
meanings within a single library. C++ makes this easy with function
overloading, which allows you to reuse the same function name as long as the
argument lists are different. Default arguments allow you to call the same
function in different ways by automatically providing default values for some of
your arguments.
Chapter 8: Constants. This
chapter covers the const and volatile keywords, which have
additional meaning in C++, especially inside classes. You’ll learn what it
means to apply const to a pointer definition. The chapter also shows how
the meaning of const varies when used inside and outside of classes and
how to create compile-time constants inside classes.
Chapter 9: Inline Functions.
Preprocessor macros eliminate function call overhead, but the preprocessor also
eliminates valuable C++ type checking. The inline function gives you all the
benefits of a preprocessor macro plus all of the benefits of a real function
call. This chapter thoroughly explores the implementation and use of inline
functions.
Chapter 10: Name Control.
Creating names is a fundamental activity in programming, and when a project
gets large, the number of names can be overwhelming. C++ allows you a great deal
of control over names in terms of their creation, visibility, placement of
storage, and linkage. This chapter shows how names are controlled in C++ using
two techniques. First, the static keyword is used to control visibility
and linkage, and its special meaning with classes is explored. A far more useful
technique for controlling names at the global scope is C++’s
namespace feature, which allows you to break up the global name space
into distinct regions.
Chapter 11: References and the
Copy-Constructor. C++ pointers work like C pointers with the additional
benefit of stronger C++ type checking. C++ also provides an additional way to
handle addresses: from Algol and Pascal, C++ lifts the reference, which
lets the compiler handle the address manipulation while you use ordinary
notation. You’ll also meet the copy-constructor, which controls the way
objects are passed into and out of functions by value. Finally, the C++
pointer-to-member is illuminated.
Chapter 12: Operator Overloading.
This feature is sometimes called “syntactic sugar;” it lets you
sweeten the syntax for using your type by allowing operators as well as function
calls. In this chapter you’ll learn that operator overloading is just a
different type of function call and you’ll learn how to write your own,
dealing with the sometimes-confusing uses of arguments, return types, and the
decision of whether to make an operator a member or friend.
Chapter 13: Dynamic Object
Creation. How many planes will an air-traffic system need to manage? How
many shapes will a CAD system require? In the general programming problem, you
can’t know the quantity, lifetime, or type of objects needed by your
running program. In this chapter, you’ll learn how C++’s new
and delete elegantly solve this problem by safely creating objects on the
heap. You’ll also see how new and delete can be overloaded
in a variety of ways so you can control how storage is allocated and
released.
Chapter 14: Inheritance and
Composition. Data abstraction allows you to create new types from scratch,
but with composition and inheritance, you can create new types from existing
types. With composition, you assemble a new type using other types as pieces,
and with inheritance, you create a more specific version of an existing type. In
this chapter you’ll learn the syntax, how to redefine functions, and the
importance of construction and destruction for inheritance and
composition.
Chapter 15: Polymorphism and virtual
Functions. On your own, you might take nine months to discover and
understand this cornerstone of OOP. Through small, simple examples, you’ll
see how to create a family of types with inheritance and manipulate objects in
that family through their common base class. The virtual keyword allows
you to treat all objects in this family generically, which means that the bulk
of your code doesn’t rely on specific type information. This makes your
programs extensible, so building programs and code maintenance is easier and
cheaper.
Chapter 16: Introduction to
Templates. Inheritance and composition allow you to reuse object
code, but that doesn’t solve all of your reuse needs. Templates allow you
to reuse source code by providing the compiler with a way to substitute
type names in the body of a class or function. This supports the use of
container class libraries, which are important tools for the rapid,
robust development of object-oriented programs (the Standard C++ Library
includes a significant library of container classes). This chapter gives you a
thorough grounding in this essential subject.
Additional topics (and more advanced
subjects) are available in Volume 2 of this book, which can be downloaded from
the Web site
www.BruceEckel.com.
I’ve discovered that exercises are
exceptionally useful during a seminar to complete a student’s
understanding, so you’ll find a set at the end of each chapter. The number
of exercises has been greatly increased over the number in the first edition.
Many of the exercises are fairly simple
so that they can be finished in a reasonable amount of time in a classroom
situation or lab section while the instructor observes, making sure all students
are absorbing the material. Some exercises are a bit more challenging to keep
advanced students entertained. The bulk of the exercises are designed to be
solved in a short time and are intended only to test and polish your knowledge
rather than present major challenges (presumably, you’ll find those on
your own – or more likely, they’ll find
you).
Solutions to selected exercises can be
found in the electronic document The Thinking in C++ Annotated Solution
Guide, available for a small fee from
www.BruceEckel.com.
The
source code for this book is
copyrighted freeware, distributed via the Web site www.BruceEckel.com.
The copyright prevents you from republishing the code in
print media without permission, but you are granted the right to use it in many
other situations (see below).
The code is available in a zipped file,
designed to be extracted for any platform that has a “zip” utility
(most do; you can search the Internet to find a version for your platform if you
don’t already have one installed). In the starting directory where you
unpacked the code you will find the following copyright notice:
//:! :Copyright.txt Copyright (c) 2000, Bruce Eckel Source code file from the book "Thinking in C++" All rights reserved EXCEPT as allowed by the following statements: You can freely use this file for your own work (personal or commercial), including modifications and distribution in executable form only. Permission is granted to use this file in classroom situations, including its use in presentation materials, as long as the book "Thinking in C++" is cited as the source. Except in classroom situations, you cannot copy and distribute this code; instead, the sole distribution point is http://www.BruceEckel.com (and official mirror sites) where it is available for free. You cannot remove this copyright and notice. You cannot distribute modified versions of the source code in this package. You cannot use this file in printed media without the express permission of the author. Bruce Eckel makes no representation about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose, or non-infringement. The entire risk as to the quality and performance of the software is with you. Bruce Eckel and the publisher shall not be liable for any damages suffered by you or any third party as a result of using or distributing this software. In no event will Bruce Eckel or the publisher be liable for any lost revenue, profit, or data, or for direct, indirect, special, consequential, incidental, or punitive damages, however caused and regardless of the theory of liability, arising out of the use of or inability to use software, even if Bruce Eckel and the publisher have been advised of the possibility of such damages. Should the software prove defective, you assume the cost of all necessary servicing, repair, or correction. If you think you've found an error, please submit the correction using the form you will find at www.BruceEckel.com. (Please use the same form for non-code errors found in the book.) ///:~
You may use the code in your projects and
in the classroom as long as the copyright notice is
retained.
Throughout this book, when referring to
conformance to the ISO C standard, I will generally just say
‘C.’ Only if it is
necessary to distinguish between Standard C and older, pre-Standard versions of
C will I make a distinction.
At this writing the
C++ Standards
Committee was finished working on the language. Thus, I will use the term
Standard C++
to refer to the standardized language. If I simply refer
to C++ you should assume I mean “Standard C++.”
There is some confusion over the actual
name of the C++ Standards Committee and the name of the standard itself. Steve
Clamage, the committee chair, clarified this:
There are two C++ standardization
committees: The NCITS (formerly X3) J16 committee and the ISO JTC1/SC22/WG14
committee. ANSI charters NCITS to create technical committees for developing
American national standards.
J16 was chartered in 1989 to create an
American standard for C++. In about 1991 WG14 was chartered to create an
international standard. The J16 project was converted to a "Type I"
(International) project and subordinated to the ISO standardization effort.
The two committees meet at the same
time at the same location, and the J16 vote constitutes the American vote on
WG14. WG14 delegates technical work to J16. WG14 votes on the technical work of
J16.
The C++ standard was originally
created as an ISO standard. ANSI later voted (as recommended by J16) to adopt
the ISO C++ standard as the American standard for C++.
Your compiler may
not support all of the features discussed in this book, especially if you
don’t have the newest version of the compiler. Implementing a language
like C++ is a Herculean task, and you can expect that the features will appear
in pieces rather than all at once. But if you attempt one of the examples in the
book and get a lot of errors from the compiler, it’s not necessarily a bug
in the code or the compiler; it may simply not be implemented in your particular
compiler
yet.
The primary content of the CD ROM
packaged in the back of this book is a “seminar on
CD ROM” titled Thinking in C: Foundations for
Java & C++ by Chuck Allison (published by MindView, Inc., and also
available in quantities at www.BruceEckel.com). This contains many hours
of audio lectures and slides, and can be viewed on most computers if you have a
CD ROM player and a sound system.
The goal of Thinking in C is to
take you carefully through the fundamentals of the C language. It focuses on the
knowledge necessary for you to be able to move on to the C++ or
Java languages instead of trying to make you an expert in
all the dark corners of C. (One of the reasons for using a higher-level language
like C++ or Java is precisely so we can avoid many of these dark corners.) It
also contains exercises and guided solutions. Keep in mind that because Chapter
3 of this book goes beyond the Thinking in C CD, the CD is not a
replacement for that chapter, but should be used instead as a preparation for
this book.
Please note that the CD ROM is
browser-based, so you should have a Web browser installed on your machine before
using
it.
There are
seminars-on-CD-ROM
planned to cover Volume 1 and Volume 2 of this book. These comprise many hours
of audio lectures by me that accompany slides that cover selected material from
each chapter in the book. They can be viewed on most computers if you have a CD
ROM player and a sound system. These CDs may be purchased at
www.BruceEckel.com, where you will find more information and sample
lectures.
My company, MindView, Inc., provides
public
hands-on training seminars based on the material in this book and also on
advanced topics. Selected material from each chapter represents a lesson, which
is followed by a monitored exercise period so each student receives personal
attention. We also provide on-site training,
consulting,
mentoring, and design and code walkthroughs. Information and sign-up forms for
upcoming seminars and other contact information can be found at
www.BruceEckel.com.
I am sometimes available for design
consulting, project evaluation and code walkthroughs. When I first began writing
about computers, my primary motivation was to increase my consulting activities,
because I find consulting to be challenging, educational, and one of my most
enjoyable experiences, professionally. Thus I will try my best to fit you into
my schedule, or to provide you with one of my associates (who are people that I
know well and trust, and often people who co-develop and teach seminars with
me).
No matter how many tricks a writer uses
to detect errors, some always creep in and these often leap off the page to a
fresh reader. If you discover anything you believe to be an error, please use
the correction form you will find at www.BruceEckel.com. Your help is
appreciated.
The first edition of this book had my
face on the cover, but I originally wanted a cover for the second edition that
was more of a work of art like the Thinking in Java cover. For some
reason, C++ seems to me to suggest Art Deco with its simple curves and brushed
chrome. I had in mind something like those posters of ships and airplanes with
the long sweeping bodies.
My friend Daniel
Will-Harris, (www.Will-Harris.com) whom I first met in junior high school
choir class, went on to become a world-class designer and writer. He has done
virtually all of my designs, including the
cover for the first edition of this
book. During the cover design process, Daniel, unsatisfied with the progress we
were making, kept asking “How does this relate people to computers?”
We were stuck.
On a whim, with no particular outcome in
mind, he asked me to put my face on the scanner. Daniel had one of his graphics
programs (Corel Xara, his favorite) “autotrace” the scan of my face.
As he describes it, “Autotracing is the computer's way to turn a picture
into the kinds of lines and curves it really likes.” Then he played with
it until he had something that looked like a topographic map of my face, an
image that might be the way a computer could see people.
I took this image and photocopied it onto
watercolor paper (some color copiers can handle thick stock), and then started
creating lots of experiments by adding watercolor to the image. We selected the
ones we liked best, then Daniel scanned them back in and arranged them into the
cover, adding the text and other design elements. The whole process happened
over several months, mostly because of the time it took me to do the
watercolors. But I’ve especially enjoyed it because I got to participate
in the art on the cover, and because it gave me incentive to do more watercolors
(what they say about practice really is
true).
The book’s interior design was
created by Daniel Will-Harris, who used to play with
rub-on letters in junior high school while he awaited the invention of computers
and desktop publishing. However, I produced the camera-ready pages myself, so
the typesetting errors are mine. Microsoft® Word for Windows
Versions 8 and 9 were used to write the book and to create camera-ready pages,
including generating the table of contents and index. (I created a COM
automation server in Python, called from Word VBA macros, to aid me in index
marking.) Python (see www.Python.org) was used to create some of the
tools for checking the code, and would have been use for the code extraction
tool had I discovered it earlier.
I created the diagrams using
Visio® – thanks to Visio Corporation for creating a useful
tool.
The body typeface
is Georgia and the headlines are in Verdana. The final camera-ready version was
produced in Adobe® Acrobat 4 and taken directly to press from
that file – thanks very much to Adobe for creating a tool that allows
e-mailing camera-ready documents, as it enables multiple revisions to be made in
a single day rather than relying on my laser printer and overnight express
services. (We first tried the Acrobat process with Thinking in Java, and
I was able to upload the final version of that book to the printer in the U.S.
from South Africa.)
The HTML version was created by exporting
the Word document to RTF, then using RTF2HTML (see
http://www.sunpack.com/RTF/) to do most of the work of the HTML
conversion. (Thanks to Chris Hector for making such a useful, and especially
reliable, tool.) The resulting files were cleaned up using a custom Python
program that I hacked together, and the WMFs were converted to GIFs using
JASC® PaintShop Pro 6 and its batch conversion tool (thanks to
JASC for solving so many problems for me with their excellent product). The
color syntax highlighting was added via a Perl script kindly contributed by
Zafir Anjum.
First, thanks to everyone on the Internet
who submitted corrections and suggestions; you’ve been tremendously
helpful in improving the quality of this book, and I couldn’t have done it
without you. Special thanks to John Cook.
The ideas and understanding in this book
have come from many sources: friends like Chuck Allison, Andrea Provaglio, Dan
Saks, Scott Meyers, Charles Petzold, and Michael Wilk; pioneers of the language
like Bjarne Stroustrup, Andrew Koenig, and Rob Murray; members of the C++
Standards Committee like Nathan Myers (who was particularly helpful and generous
with his insights), Bill Plauger, Reg Charney, Tom Penello, Tom Plum, Sam
Druker, and Uwe Steinmueller; people who have spoken in my C++ track at the
Software Development Conference; and often students in my seminars, who ask the
questions I need to hear in order to make the material more
clear.
A huge thank-you to my friend Gen
Kiyooka, whose company Digigami has provided me with a web
server.
My friend Richard Hale Shaw and I have
taught C++ together; Richard’s insights and support have been very helpful
(and Kim’s, too). Thanks also to KoAnn Vikoren, Eric Faurot, Jennifer
Jessup, Tara Arrowood, Marco Pardi, Nicole Freeman, Barbara Hanscome, Regina
Ridley, Alex Dunne, and the rest of the cast and crew at MFI.
A special thanks to all my teachers and
all my students (who are my teachers as well).
And for favorite writers, my deep
appreciation and sympathy for your efforts: John Irving, Neal Stephenson,
Robertson Davies (we shall miss you), Tom Robbins, William Gibson, Richard Bach,
Carlos Castaneda, and Gene Wolfe.
To Guido van Rossum, for inventing Python
and giving it selflessly to the world. You have enriched my life with your
contribution.
Thanks to the people at Prentice Hall:
Alan Apt, Ana Terry, Scott Disanno, Toni Holm, and my electronic copy-editor
Stephanie English. In marketing, Bryan Gambrel and Jennie Burger.
Sonda Donovan helped with the production
of the CD Rom. Daniel Will-Harris (of course) created the silkscreen design
that’s on the Disc itself.
To all the great folks in Crested Butte,
thanks for making it a magical place, especially Al Smith (creator of the
wonderful Camp4 Coffee Garden), my neighbors Dave & Erika, Marsha at
Heg’s Place bookstore, Pat & John at the Teocalli Tamale, Sam at the
Bakery Café, and Tiller for his help with audio research. And to all the
terrific people that hang out at Camp4 in and make my mornings
interesting.
The supporting cast of friends includes,
but is not limited to, Zack Urlocker, Andrew Binstock, Neil Rubenking, Kraig
Brockschmidt, Steve Sinofsky, JD Hildebrandt, Brian McElhinney, Brinkley Barr,
Larry O’Brien, Bill Gates at Midnight Engineering Magazine, Larry
Constantine, Lucy Lockwood, Tom Keffer, Dan Putterman, Gene Wang, Dave Mayer,
David Intersimone, Claire Sawyers, the Italians (Andrea Provaglio, Rossella
Gioia, Laura Fallai, Marco & Lella Cantu, Corrado, Ilsa and Christina
Giustozzi), Chris and Laura Strand (and Parker), the Almquists, Brad Jerbic,
Marilyn Cvitanic, the Mabrys, the Haflingers, the Pollocks, Peter Vinci, the
Robbins, the Moelters, Dave Stoner, Laurie Adams, the Cranstons, Larry Fogg,
Mike and Karen Sequeira, Gary Entsminger and Allison Brody, Kevin, Sonda, &
Ella Donovan, Chester and Shannon Andersen, Joe Lordi, Dave and Brenda Bartlett,
the Rentschlers, Lynn and Todd, and their families. And of course, Mom and
Dad.
[1]
Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, 1986
(first edition).
[2]
Using C++, Osborne/McGraw-Hill 1989.
[3]
Using C++ and C++ Inside & Out, Osborne/McGraw-Hill
1993.