Here is a short list of books on C++, Java, and object-oriented programming. Each of these is an exceptional book, and just about every C++ programmer will have most of these on his or her bookshelf. I highly recommend each of them.

A note on the field of technical/professional publishing: Authors often have to sign a deal agreeing to be responsible in some way for subsequent editions. Publishers do this to make money. After all, if you have the second edition of a book and it has been updated, then you probably will want the most recent edition. However, at some point an author may lose interest in revising his or her book or there simply may not be much new to add. Therefore, the latest edition may not represent much of a value to you. I have tried to keep up with times and point out new features. Please contact me if you feel that I am missing some important information or if your favorite book has not made this list.

Grady Booch

Grady Booch, Object-Oriented Analysis and Design. (Benjamin Cummings Publishing Co., 1994)

This presents OO theory and design techniques such as notation.

James O. Coplien

James O. Coplien, Advanced C++: Programming Styles and Idioms (Addison Wesley, 1992)

This assumes you have a basic knowledge of C++, so this is not for beginners. However, it is brilliant in its study of abstract data types.

Cay S. Hortmann and Gary Cornell

Cay S. Hortmann and Gary Cornell, Core Java 1.2 Volumes 1 and 2 (Sun Microsystems Press: A Prentice Hall Title, 1999)

Actually, as of this writing, Volume 2 has been published but I have not yet reviewed it. Also, Sun decided that Java 1.2 is really Java 2.0 so the book may also be found under the title Core Java 2.

Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

Gamma, et al. Design Patterns: Elements of Reusable Object-Oriented Software(Addison Wesley, 1995)

This has become a classic in the field of OO programming. The reader of this book should already be familiar with OO programming and concepts. From the preface: this is "...a book of design patterns that describes simple and elegant solutions to specific problems in object-oriented software design. Design patterns capture solutions that have developed and evolved over time."

Stanley B. Lippman

Stanley B. Lippmann, C++ Primer, 2nd Ed. (Addison Wesley, 1991)

Although this book is referred to as a primer, I have found it to be useful as a reference as well. A third edition was published in 1998. The third edition has a co-author, Josee Lajoie and seems to have doubled in size. The third edition is actually quite different from the second addition and it almost seems a shame that the third edition was not released under a separate title, since now the second edition is difficult to obtain. Nevertheless, the third edition is very useful.

Scott Meyers

Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Designs (Addison Wesley, 1992)

Meyers is capitalizing on the popularity of this edition and has come out with two additional books: More Effective C++ : 35 New Ways to Improve Your Programs and Designs and another book which combines the two and is called Effective C++: 85 Specific Ways to Improve Your Programs and Designs

Bjarne Stroustrup

Bjarne Stroustrup, The C++ Programming Language, 3rd Ed. (Addison Wesley, 1997)

Stroustrup is the father of the C++ language, and as such, this is a must for your bookshelf. It tends, however, to be fairly dense. The previous edition was published in 1991. Much has changed since then, most notably of which was the publication of the ANSI/ISO standard. 1