"Readers can pick up this book and become familiar with C++ in a short time. Stan has taken a very broad and complicated topic and reduced it to the essentials that budding C++ programmers need to know to write real programs. His case study is effective and provides a familiar thread throughout the book." --Steve Vinoski, IONA
For the practicing programmer with little time to spare, Essential C++ offers a fast-track to learning and working with C++ on the job. This book is specifically designed to bring you up to speed in a short amount of time. It focuses on the elements of C++ programming that you are most likely to encounter and examines features and techniques that help solve real-world programming challenges.
Essential C++ presents the basics of C++ in the context of procedural, generic, object-based, and object-oriented programming. It is organized around a series of increasingly complex programming problems, and language features are introduced as solutions to these problems. In this way you will not only learn about the functions and structure of C++, but will understand their purpose and rationale.
You will find in-depth coverage of key topics such as:
In addition, an invaluable appendix provides complete solutions to, and detailed explanations of, the programming exercises found at the end of each chapter. A second appendix offers a quick reference handbook for the generic algorithms, providing an example of how each is used.
This concise tutorial will give you a working knowledge of C++ and a firm foundation on which to further your professional expertise.
Dowload the Source Code by clicking on the links below:
Structure of This Book.
A Note on the Source Code.
Where to Find More Information.
1. Basic C++ Programming.
How to Write a C++ Program.
Defining and Initializing a Data Object.
Writing Conditional and Loop Statements.
How to Use Arrays and Vectors.
Pointers Allow for Flexibility.
Writing and Reading Files.
How to Write a Function.
Invoking a Function.
Providing Default Parameter Values.
Using Local Static Objects.
Declaring a Function Inline.
Providing Overloaded Functions.
Defining and Using Template Functions.
Pointers to Functions Add Flexibility.
Setting Up a Header File.
The Arithmetic of Pointers.
Making Sense of Iterators.
Operations Common to All Containers.
Using the Sequential Containers.
Using the Generic Algorithms.
How to Design a Generic Algorithm.
Using a Map.
Using a Set.
How to Use Iterator Inserters.
Using the iostream Iterators.
How to Implement a Class.
What are Class Constructors and the Class Destructor?
What are mutable and const?
What is the this Pointer?
Static Class Members.
Building an Iterator Class.
Collaboration Sometimes Requires Friendship.
Implementing a Copy Assignment Operator.
Implementing a Function Object.
Providing Class Instances of the iostream Operators.
Pointers to Class Member Functions.
A Tour of Object-Oriented Programming.
Polymorphism without Inheritance.
Defining an Abstract Base Class.
Defining a Derived Class.
Using an Inheritance Hierarchy.
How Abstract Should a Base Class Be?
Initialization, Destruction, and Copy.
Defining a Derived Class Virtual Function.
Run-Time Type Identification.
The Template Class Definition.
Handling Template Type Parameters.
Implementing the Template Class.
A Function Template Output Operator.
Constant Expressions and Default Parameters.
Template Parameters as Strategy.
Member Template Functions.
Throwing an Exception.
Catching an Exception.
Trying for an Exception.
Local Resource Management.
The Standard Exceptions.
Gosh, but this book is short. I mean, wow. My C++ Primer is 1237 pages counting the index, title, and dedication pages. This one weighs in at just under 300 -- in boxing terms, we're talking bantamweight.
The first question, of course, is how come? Actually, there's a story to that.
I'd been pestering everyone at Disney Feature Animation for a number of years to let me work on a production. I asked directors, management types -- even Mickey, if the truth be told. In part, it was for the glamour, I suppose. Hollywood. The big screen. Also, I hold a Master of Fine Arts as well as my Comp Sci degree, and film work seemed to promise some sort of personal synthesis. What I told management, of course, was that I needed the experience in production in order to provide usable tools. As a compiler writer, I'd always been one of my own main users. It's difficult to get defensive or feel unfairly criticized when you're one of the principal complainers about your software.
The computer effects lead on the Firebird segment of Fantasia 2000 was interested in having me join the production. To kind of try things out, he asked me to write a tool to read the raw Disney camera information for a scene and generate a camera node that could be plugged in to the Houdini animation package. I wrote it in C++, of course. It worked. They liked it. I was invited to come on board.
Once on the production (thanks to Jinko and Chyuan), I was asked to rewrite the tool in Perl. The other TDs, it was explained, weren't heavy-duty programmers but knew Perl, Tcl, and so on. (TD is film industry jargon for technical director. I was the segment's software TD. There was also a lighting TD (hi, Mira) and a model TD (hi, Tim) as well as the actual computer effects animators (hi, Mike, Steve, and Tonya).) And oh, by the way, could I do this quickly, because, gosh, we have a proof of concept test to get out that the directors (hi, Paul and Gaetan) and effects supervisor (hi, Dave) are waiting on to pitch to the then head of Feature Animation (hi, Peter). No emergency, you understand, but ...
This left me in somewhat of a quandary. I can program reasonably quickly in C++ with confidence. Unfortunately, I didn't know Perl. I thought, OK, I'll read a book. But it can't be too big a book, at least not right now. And it had better not tell me too much, although I know I should know everything, only later. After all, this is show biz: The directors need a proof of concept, the artist needs a plug-in to prove the concept, and the producer -- heck, she needs a 48 hour day. I didn't need the best book on Perl -- just the right book to get me going and not steer me too far off the righteous path.
I found that book in Learning Perl by Randal Schwartz. It got me up and running, and it was fun to read. Well, as much as any computer book is fun. It leaves out gobs of good stuff. At the time, though, I didn't need all that stuff -- I needed to get my Perl scripts working.
Eventually, I realized sadly that the third edition of C++ Primer could no longer fill a similar role for someone needing to learn C++. It had just become too big. I think it's a grand book, of course -- particularly with Josee Lajoie coming on board as co-author of the third edition. But it's too comprehensive for this kind of just-in-time C++ language learning. That's why I decided to write this book.
You're probably thinking, but C++ is not Perl. That's correct. And this text is not Learning Perl. It's about learning C++. The real question is, How does one shed almost a thousand pages and still claim to be teaching anything?
The text consists of seven chapters and two appendixes. Chapter 1 provides a description of the predefined language in the context of writing a small interactive program. It covers the built-in data types, the predefined operators, the vector and string library classes, the conditional and looping statements, and the iostream library for input and output. I introduce the vector and string classes in this chapter because I encourage their use over the built-in array and C-style character string.
Chapter 2 explains how to design and use a function and walks through the many flavors of functions supported in C++: inline, overloaded, and template functions as well as pointers to functions.
Chapter 3 covers what is commonly referred to as the Standard Template Library (STL): a collection of container classes, such as a vector, list, set, and map, and generic algorithms to operate on those containers, such as
merge(). Appendix B presents an alphabetical listing of the most commonly used generic algorithms and provides an example of how each one is used.
As a C++ programmer, your primary activity is the delivery of classes and object-oriented class hierarchies. Chapter 4 walks through the design and use of the C++ class facility to create data types specific to your application domain. For example, at Dreamworks Animation, where I do some consulting work, we design classes to do four-channel compositing of images and so on. Chapter 5 explains how to extend class design to support families of related classes in object-oriented class hierarchies. Rather than design eight independent image compositing classes, for example, we define a compositing hierarchy using inheritance and dynamic binding.
Class templates are the topic of Chapter 6. A class template is a kind of prescription for creating a class in which one or more types or values are parameterized. A vector class, for example, may parameterize the type of element it contains. A buffer class may parameterize not only the type of element it holds but also the size of its buffer. The chapter is driven by the implementation of a binary tree template class.
Finally, Chapter 7 illustrates how to use the C++ exception handling facility and fit it into the existing standard library exception class hierarchy. Appendix A provides solutions to the programming exercises. Appendix B provides a program example and discussion of the most frequently used generic algorithm.
The full source code of the programs developed within the text as well as the solutions to the exercises is available on-line for downloading both at the Addison-Wesley Longman web site and on my home page (www.objectwrite.com). All the code has been executed under both Visual C++ 5.0 using the Intel C++ compiler and Visual C++ 6.0 using the Microsoft C++ compiler. You may need to modify the code slightly to have it compile on your system. If you make any modifications, send me a list of them (email@example.com) and I will post them, along with your name, in a modifications file attached to the solutions code. (Note that the full source code is not displayed within the text itself.)
Special thanks go to Josee Lajoie, coauthor of C++ Primer, 3rd Edition. She has been a wonderful support both because of her insightful comments on the various drafts of this text and because of her unfailing encouragement. I also offer special thanks to Dave Slayton for going through both the text and the code examples with a razor sharp green pencil, and to Steve Vinoski for his compassionate but firm comments on the drafts of this text.
Special thanks also go to the Addison Wesley editorial team: Deborah Lafferty, who, as editor, supported this project from the beginning, Betsy Hardinger, who, as copyeditor, contributed greatly to the readability of the text, and John Fuller, who, as production manager, shepherded us from manuscript to bound text.
During the writing of this text, I worked as an independent consultant, multiplexing between Essential C++ and a set of (reasonably) understanding clients. I'd like to thank Colin Lipworth, Edwin Leonard, and Kenneth Meyer for their patience and good faith.
From a completely biased point of view, the two best one-volume introductions to C++ are Lippman and Lajoie's C++ Primer, 3rd Edition and Stroustrup's The C++ Programming Language, both in their third edition. Throughout the text I refer you to one or both of the texts for more in-depth information. The following books are cited in the text. (A more extensive bibliography can be found in both C++ Primer and The C++ Programming Language.)
The text of the book is set in 10.5 pt. Palatino. Program text and language keywords appear in 8.5 pt.
Lucida. Functions are identified by following their name with the C++ function call operator (
()). Thus, for example, foo represents a program object, and
bar() represents a program function. Class names are set in Palatino.