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.
Thinking in C++, Volume 2 is
freely downloadable in its entirety from the web site at
www.BruceEckel.com. The final version of
Volume 2 will be completed and printed in Summer 2002.
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) MindView, Inc., 2001 Source code file from the book "Thinking in C++, 2nd Edition, Volume 2." 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.