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++ in 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 which have rearranged my brain to make me start “thinking in
C++.”
This book is a thorough rewrite of the first edition to
reflect all the changes introduced in C++ by the finalization of the ANSI/ISO
C++ Standard. 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 haven’t been exposed. The CD ROM bound into the back of the book
contains a seminar which 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).
So the short answer 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 Standard Template Library
(STL) as well as new complexity in templates. These and other more advanced
topics have been relegated to Volume 2 of this book, including issues like
multiple inheritance, exception handling, design patterns and topics about
building stable systems and debugging
them.
Just like the book that you currently hold, Thinking in
C++, Volume 2 is freely downloadable in its entirety from my web site at
www.BruceEckel.com. The final version of
Volume 2 will be completed and printed in late 2000 or early 2001.
The web site also contains the source code for both the books,
along with updates and information about CD ROMs, public seminars, and in-house
training, consulting, mentoring and
walk-throughs.
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 very
rapid introduction to C, along with the Thinking in C seminar-on-CD, but
still assuming that you have some kind of programming experience already. 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 as I
expect many of the readers of this book will: 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, where 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( ) &
free( ), setjmp( ) & longjmp( ), and
other “sophisticated” concepts, scuttling away in shame when the
subjects came up in conversation rather than reaching out for new
knowledge.
When I began my struggle to understand C++, the only decent
book was 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 an enthusiastic response.
At about the same time that Using C++ came out, I began
teaching the language in live 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 with 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.
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, struggling with a new programming
language.
My goals in this book are to:
C++ is a language where 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 have passed
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
that came from audiences as I taught it.
This course was designed with one thing in mind: to streamline
the process of learning the C++ language. Audience feedback helped me understand
which parts were difficult and needed extra illumination. In the areas where 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:
(5) Introduction to iostreams. One of the original C++
libraries – the one that provides the essential I/O facility – is
called iostreams. Iostreams is intended to replace C’s stdio.h with
an I/O library that is easier to use, more flexible, and extensible – you
can adapt it to work with your new classes. This chapter teaches you the ins and
outs of how to make the best use of the existing iostream library for standard
I/O, file I/O, and in-memory formatting.
(15) Multiple inheritance. This sounds simple at
first: A new class is inherited from more than one existing class. However, you
can end up with ambiguities and multiple copies of base-class objects. That
problem is solved with virtual base classes, but the bigger issue remains: When
do you use it? Multiple inheritance is only essential when you need to
manipulate an object through more than one common base class. This chapter
explains the syntax for multiple inheritance, and shows alternative approaches
– in particular, how templates solve one common problem. The use of
multiple inheritance to repair a “damaged” class interface is
demonstrated as a genuinely valuable use of this feature.
(16) Exception handling. Error handling has always been
a problem in programming. Even if you dutifully return error information or set
a flag, the function caller may simply ignore it. Exception handling is a
primary feature in C++ that solves this problem by allowing you to
“throw” an object out of your function when a critical error
happens. You throw different types of objects for different errors, and the
function caller “catches” these objects in separate error handling
routines. If you throw an exception, it cannot be ignored, so you can guarantee
that something will happen in response to your error.
(17) Run-time type identification. Run-time type
identification (RTTI) lets you find the exact type of an object when you only
have a pointer or reference to the base type. Normally, you’ll want to
intentionally ignore the exact type of an object and let the virtual function
mechanism implement the correct behavior for that type. But occasionally it is
very helpful to know the exact type of an object for which you only have a base
pointer; often this information allows you to perform a special-case operation
more efficiently. This chapter explains what RTTI is for and how to use
it.
I’ve discovered that simple 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.
These are fairly simple, so they can be finished in a
reasonable amount of time in a classroom situation while the instructor
observes, making sure all the students are absorbing the material. Some
exercises are a bit more challenging to keep advanced students entertained.
They’re all designed to be solved in a short time and are only there 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 exercises can be found in the electronic document
The C++ Annotated Solution Guide, Volume 2 by Chuck Allison, available
for a small fee from www.BruceEckel.com.
[[ Note this is not yet available
]]
The source code for this book is copyrighted freeware,
distributed via the web site http://www.BruceEckel.com. The copyright prevents
you from republishing the code in print media without permission.
Although the code is available in a zipped file on the above
web site, you can also unpack the code yourself by downloading the text version
of the book and running the program ExtractCode (from Volume 2 of this
book), the source for which is also provided on the Web site. The program will
create a directory for each chapter and unpack the code into those directories.
In the starting directory where you unpacked the code you will find the
following copyright notice:
//:! :CopyRight.txt Copyright (c) Bruce Eckel, 1999 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 freely available. 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 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
ANSI/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 the distinction.
At this writing the ANSI/ISO C++ 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++.”
Your compiler may not support all the features discussed in
this book, especially if you don’t have the newest version of your
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.
My company, MindView, Inc., provides public hands-on training
seminars based on the material in this book, and also for 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 & code
walkthroughs. Information and sign-up forms for upcoming seminars and other
contact information can be found at
http://www.BruceEckel.com.
No matter how many tricks a writer uses to detect errors, some
always creep in and these often leap off the page for a fresh reader. If you
discover anything you believe to be an error, please use the correction form you
will find at http://www.BruceEckel.com. Your help is
appreciated.
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), Tom Plum, Reg Charney, Tom Penello, Sam Druker, and Uwe Steinmueller;
people who have spoken in my C++ track at the Software Development Conference;
and very often students in my seminars, who ask the questions I need to hear in
order to make the material clearer.
I have been presenting this material on tours produced by
Miller Freeman Inc. with my friend Richard Hale Shaw. Richard’s insights
and support have been very helpful (and Kim’s, too). Thanks also to KoAnn
Vikoren, Eric Faurot, Jennifer Jessup, Nicole Freeman, Barbara Hanscome, Regina
Ridley, Alex Dunne, and the rest of the cast and crew at MFI.
The book design, cover design, and cover photo were created by
my friend Daniel Will-Harris, noted author and designer, 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 97
was used to write the book and to create camera-ready pages. The body typeface
is [Times for the electronic distribution] and the headlines are in [Times for
the electronic distribution].
A special thanks to all my teachers, and all my students (who
are my teachers as well).
Personal thanks to my friends Gen Kiyooka and Kraig
Brockschmidt. The supporting cast of friends includes, but is not limited to:
Zack Urlocker, Andrew Binstock, Neil Rubenking, Steve Sinofsky, JD Hildebrandt,
Brian McElhinney, Brinkley Barr, Larry O’Brien, Bill Gates at Midnight
Engineering Magazine, Larry Constantine & Lucy Lockwood, Tom Keffer, Greg
Perry, Dan Putterman, Christi Westphal, Gene Wang, Dave Mayer, David
Intersimone, Claire Sawyers, Claire Jones, The Italians (Andrea Provaglio, Laura
Fallai, Marco Cantu, Corrado, Ilsa and Christina Giustozzi), Chris & Laura
Strand, The Almquists, Brad Jerbic, Marilyn Cvitanic, The Mabrys, The
Haflingers, The Pollocks, Peter Vinci, The Robbins Families, The Moelter
Families (& the McMillans), The Wilks, Dave Stoner, Laurie Adams, The
Penneys, The Cranstons, Larry Fogg, Mike & Karen Sequeira, Gary Entsminger
& Allison Brody, Chester Andersen, Joe Lordi, Dave & Brenda Bartlett,
The Rentschlers, The Sudeks, Lynn & Todd, and their families. And of course,
Mom & 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.