The
Design and Evolution
of
C++
Bjarne Stroustrup
AT&T Bell Laboratories
Murray Hill, New Jersey
ADDISON-WESLEY PUBLISHING COMPANY
Reading, Massachusetts • Menlo Park, California • New York
Don Mills, Ontario • Wokingham, England • Amsterdam • Bonn • Sydney
Singapore • Tokyo • Madrid • San Juan • Milan • Paris
Library of Congress Cataloging-in-Publication Data
Stroustrup, Bjarne.
The Design and Evolution of C++ / Bjarne Stroustrup.
p.
cm.
Includes bibliographical references and index.
ISBN 0-201-54330-3
1. C++ (Computer program language) I. Title.
II. Title: Design and Evolution of C plus plus.
QA76.73.C153S79 1994
005.13'3—dc20
93-50758
CIP
AT&T
Copyright © 1994 by AT&T Bell Labs.
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system,
or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or
otherwise, without the prior written permission of the publisher. Printed in the United States of
America.
This book was typeset in Times Roman and Courier by the author.
1 2 3 4 5 6 7 89 10-MA-969594
Preface
He who does not plow,
must write.
- Martin A. Hansen
The ACM HOPL-2 conference on the History of Programming Languages asked me
to write a paper on the history of C++. This seemed a reasonable idea and a bit of an
honor, so I started writing. To get a more comprehensive and balanced view of C++'s
growth, I asked a few friends from the early days of C++ for their recollections. That
caused news of this project to travel through the grapevine. There, the story mutated,
and one day I received a message from a friend asking where he could buy my new
book on the design of C++. That email message is the real origin of this book.
Traditional books about programming and programming languages explain what a
language is and how to use it. However, many people are also curious about why a
language is the way it is and how it came to be that way. This book answers these last
two questions for C++. It explains how C++ evolved from its first design to the lan
guage in use today. It describes the key problems, design aims, language ideas, and
constraints that shaped C++, and how they changed over time.
Naturally, C++ and the ideas about design and programming that shaped it didn't
just mutate by themselves. What really evolved was the C++ users' understanding of
their practical problems and of the tools needed to help solve them. Consequently,
this book also traces the key problems tackled using C++ and the views of the people
who tackled them in ways that influenced C++.
C++ is still a young language. Some of the issues discussed here are yet unknown
to many users. Many implications of decisions described here will not become obvi
ous for years to come. This book presents my view of how C++ came about, what it
is, and what it ought to be. I hope this will be of help to people trying to understand
how best to use C++ and in the continuing evolution of C++.
iv Preface
The emphasis is on the overall design goals, practical constraints, and people that
shaped C++. The key design decisions relating to language features are discussed and
put into their historical context. The evolution of C++ is traced from C with Classes
through Release 1.0 and 2.0 to the current ANSI/ISO standards work and the explo
sion of use, interest, commercial activity, compilers, tools, environments, and
libraries. C++'s relationship to C and Simula is discussed in detail. C++'s relation
ship to other languages is discussed briefly. The design of major language facilities
such as classes, inheritance, abstract classes, overloading, memory management, tem
plates, exception handling, run-time type information, and namespaces are discussed
in some detail.
The primary aim of this book is to give C++ programmers a better idea of the
background and fundamental concepts of their language and hopefully to inspire them
to experiment with ways of using C++ that are new to them. This book can also be
read by experienced programmers and students of programming languages and might
help them decide whether using C++ might be worth their while.
Acknowledgments
I am very grateful to Steve Clamage, Tony Hansen, Lorraine Juhl, Peter Juhl, Brian
Kernighan, Lee Knight, Doug Lea, Doug McIlroy, Barbara Moo, Jens Palsberg, Steve
Rumsby, and Christopher Skelly for reading complete drafts of this book. Their con
structive comments caused major changes to the contents and organization of this
book. Steve Buroff, Martin Carroll, Sean Corfield, Tom Hagelskjær, Rick Hollin-
beck, Dennis Mancl, and Stan Lippman helped by commenting on selected chapters.
Also, thanks to Archie Lachner for asking for this book before I had thought of writ
ing it.
Naturally, I owe thanks to the many people who helped make C++. In a sense, this
book is a tribute to them and some of their names can be found throughout the chap
ters and in the index. Should I single out individuals, it must be Brian Kernighan,
Andrew Koenig, Doug McIlroy, and Jonathan Shopiro, each of whom has been a
steady source of help, encouragement, and ideas for more than a decade. Also, thanks
to Kristen Nygaard and Dennis Ritchie as the designers of Simula and C from which
the key ingredients of C++ were borrowed. Over the years, I have come to appreciate
them not only as brilliant and practical language designers, but also as gentlemen and
thoroughly likable individuals.
Murray Hill, New Jersey
Bjarne Stroustrup
Contents
iii
iv
v
1
1
2
4
4
5
7
17
19
19
22
23
Preface
Contents
Acknowledgments
Notes to the Reader
Introduction
How to Read this Book
C++ Timeline
Focus on Use and Users
Programming Languages
References
Part I:
The Prehistory of C++
1.1 Simula and Distributed Systems
1.2 C and Systems Programming
1.3 General Background
vi
Contents
C with Classes
2.1 The Birth of C with Classes
2.2 Feature overview
2.3 Classes
2.4 Run-Time Efficiency
2.5 The Linkage Model
2.6 Static Type Checking
2.7 Why C?
2.8 Syntax Problems
2.9 Derived Classes
2.10 The Protection Model
2.11 Run-Time Guarantees
2.12 Minor Features
2.13 Features Considered, but not Provided
2.14 Work Environment
The Birth of C++
3.1 From C with Classes to C++
3.2 Aims
3.3 Cfront
3.4 Language Features
3.5 Virtual Functions
3.6 Overloading
3.7 References
3.8 Constants
3.9 Memory Management
3.10 Type Checking
3.11 Minor Features
3.12 Relationship to Classic C
3.13 Tools for Language Design
3.14 The C++ Programming Language (1st edition)
3.15 The Whatis? Paper
C++ Language Design Rules
4.1 Rules and Principles
4.2 General Rules
4.3 Design Support Rules
4.4 Language-Technical Rules
4.5 Low-Level Programming Support Rules
4.6 A Final Word
27
27
29
30
32
34
40
43
45
49
53
56
58
59
60
63
63
65
66
71
72
78
85
89
91
92
93
100
103
105
106
109
109
110
114
117
120
122
Chronology 1985-1993
5.1 Introduction
5.2 Release 2.0
5.3 The Annotated Reference Manual
5.4 ANSI and ISO Standardization
Standardization
6.1 What is a Standard?
6.2 How does the Committee Operate?
6.3 Clarifications
6.4 Extensions
6.5 Examples of Proposed Extensions
Interest and Use
7.1 The Explosion in Interest and Use
7.2 Teaching and Learning C++
7.3 Users and Applications
7.4 Commercial Competition
Libraries
8.1 Introduction
8.2 C++ Library Design
8.3 Early Libraries
8.4 Other Libraries
8.5 A Standard Library
Looking Ahead
9.1 Introduction
9.2 Retrospective
9.3 Only a Bridge?
9.4 What Will Make C++ Much More Effective?
Contents
vii
123
123
124
126
128
133
133
136
138
147
153
163
163
168
173
175
181
181
182
184
191
194
195
195
195
200
205