没有合适的资源?快使用搜索试试~ 我知道了~
首页C++编程语言经典教程:深入理解C++编程思想
C++编程语言经典教程:深入理解C++编程思想
需积分: 46 2 下载量 92 浏览量
更新于2024-07-24
收藏 3.38MB PDF 举报
C++编程思想
C++编程思想是C++语言的经典著作,书中详细讲述了C++语言的设计理念、语法特性、编程思想等方面的内容。下面是从给定的文件中生成的相关知识点:
1. C++语言的设计理念:C++语言的设计者Bjarne Stroustrup在书中详细介绍了C++语言的设计理念,包括语言的历史发展、设计目标、语言特性等方面的内容。
2. C++语言的语法特性:书中详细讲述了C++语言的语法特性,包括变量声明、数据类型、运算符、控制结构、函数、数组、指针等方面的内容。
3. C++语言的编程思想:书中介绍了C++语言的编程思想,包括面向对象编程、泛型编程、函数式编程等方面的内容。
4. C++语言的标准库:书中详细介绍了C++语言的标准库,包括输入/输出流、字符串处理、容器类、算法库等方面的内容。
5. C++语言的应用领域:书中讨论了C++语言在不同领域的应用,包括操作系统、网络编程、数据库编程、图形编程等方面的内容。
6. C++语言的发展历程:书中回顾了C++语言的发展历程,包括语言的发源、演变、标准化等方面的内容。
7. C++语言的设计原则:书中介绍了C++语言的设计原则,包括零成本抽象、静态类型检查、编译期计算等方面的内容。
8. C++语言的编译器实现:书中讨论了C++语言的编译器实现,包括编译器的架构、语法分析、语义分析、代码生成等方面的内容。
9. C++语言的 runtime 环境:书中介绍了C++语言的 runtime 环境,包括内存管理、异常处理、线程编程等方面的内容。
10. C++语言的未来发展方向:书中讨论了C++语言的未来发展方向,包括语言的演变、标准化、新的语言特性等方面的内容。
《C++编程思想》是一本非常经典的C++语言编程书籍,书中涵盖了C++语言的方方面面的内容,对于C++语言的学习和应用具有非常重要的参考价值。
Section 1.1.1 Examples and References 5
1.1.1 Examples and References
This book emphasizes program organization rather than the writing of algorithms. Consequently, I
avoid clever or harder-to-understand algorithms. A trivial algorithm is typically better suited to
illustrate an aspect of the language definition or a point about program structure. For example, I
use a Shell sort where, in real code, a quicksort would be better. Often, reimplementation with a
more suitable algorithm is an exercise. In real code, a call of a library function is typically more
appropriate than the code used here for illustration of language features.
Textbook examples necessarily give a warped view of software development. By clarifying and
simplifying the examples, the complexities that arise from scale disappear. I see no substitute for
writing realistically-sized programs for getting an impression of what programming and a program-
ming language are really like. This book concentrates on the language features, the basic tech-
niques from which every program is composed, and the rules for composition.
The selection of examples reflects my background in compilers, foundation libraries, and simu-
lations. Examples are simplified versions of what is found in real code. The simplification is nec-
essary to keep programming language and design points from getting lost in details. There are no
‘‘cute’’ examples without counterparts in real code. Wherever possible, I relegated to Appendix C
language-technical examples of the sort that use variables named x x and y y, types called A A and B B, and
functions called f f() and g g().
In code examples, a proportional-width font is used for identifiers. For example:
#i in nc cl lu ud de e<i io os st tr re ea am m>
i in nt t m ma ai in n()
{
s st td d: :c co ou ut t << "H He el ll lo o, n ne ew w w wo or rl ld d!\ \n n";
}
At first glance, this presentation style will seem ‘‘unnatural’’ to programmers accustomed to seeing
code in constant-width fonts. However, proportional-width fonts are generally regarded as better
than constant-width fonts for presentation of text. Using a proportional-width font also allows me
to present code with fewer illogical line breaks. Furthermore, my experiments show that most peo-
ple find the new style more readable after a short while.
Where possible, the C
++
language and library features are presented in the context of their use
rather than in the dry manner of a manual. The language features presented and the detail in which
they are described reflect my view of what is needed for effective use of C
++
. A companion, The
Annotated C
++
Language Standard, authored by Andrew Koenig and myself, is the complete defi-
nition of the language together with comments aimed at making it more accessible. Logically,
there ought to be another companion, The Annotated C
++
Standard Library. However, since both
time and my capacity for writing are limited, I cannot promise to produce that.
References to parts of this book are of the form §2.3.4 (Chapter 2, section 3, subsection 4),
§B.5.6 (Appendix B, subsection 5.6), and §6.6[10] (Chapter 6, exercise 10). Italics are used spar-
ingly for emphasis (e.g., ‘‘a string literal is not acceptable’’), for first occurrences of important con-
cepts (e.g., polymorphism), for nonterminals of the C
++
grammar (e.g., for-statement), and for com-
ments in code examples. Semi-bold italics are used to refer to identifiers, keywords, and numeric
values from code examples (e.g., c co ou un nt te er r, c cl la as ss s, and 1 17 71 12 2).
The C++ Programming Language, Special Edition by Bjarne Stroustrup. Copyright 2000 by AT&T.
Published by Addison Wesley, Inc. ISBN 0-201-70073-5. All rights reserved.
6 Notes to the Reader Chapter 1
1.1.2 Exercises
Exercises are found at the ends of chapters. The exercises are mainly of the write-a-program vari-
ety. Always write enough code for a solution to be compiled and run with at least a few test cases.
The exercises vary considerably in difficulty, so they are marked with an estimate of their diffi-
culty. The scale is exponential so that if a (∗1) exercise takes you ten minutes, a (∗2) might take an
hour, and a (∗3) might take a day. The time needed to write and test a program depends more on
your experience than on the exercise itself. A (∗1) exercise might take a day if you first have to get
acquainted with a new computer system in order to run it. On the other hand, a (∗5) exercise might
be done in an hour by someone who happens to have the right collection of programs handy.
Any book on programming in C can be used as a source of extra exercises for Part I. Any book
on data structures and algorithms can be used as a source of exercises for Parts II and III.
1.1.3 Implementation Note
The language used in this book is ‘‘pure C
++
’’ as defined in the C
++
standard [C
++
,1998]. There-
fore, the examples ought to run on every C
++
implementation. The major program fragments in
this book were tried using several C
++
implementations. Examples using features only recently
adopted into C
++
didn’t compile on every implementation. However, I see no point in mentioning
which implementations failed to compile which examples. Such information would soon be out of
date because implementers are working hard to ensure that their implementations correctly accept
every C
++
feature. See Appendix B for suggestions on how to cope with older C
++
compilers and
with code written for C compilers.
1.2 Learning C
++
The most important thing to do when learning C
++
is to focus on concepts and not get lost in
language-technical details. The purpose of learning a programming language is to become a better
programmer; that is, to become more effective at designing and implementing new systems and at
maintaining old ones. For this, an appreciation of programming and design techniques is far more
important than an understanding of details; that understanding comes with time and practice.
C
++
supports a variety of programming styles. All are based on strong static type checking, and
most aim at achieving a high level of abstraction and a direct representation of the programmer’s
ideas. Each style can achieve its aims effectively while maintaining run-time and space efficiency.
A programmer coming from a different language (say C, Fortran, Smalltalk, Lisp, ML, Ada, Eiffel,
Pascal, or Modula-2) should realize that to gain the benefits of C
++
, they must spend time learning
and internalizing programming styles and techniques suitable to C
++
. The same applies to pro-
grammers used to an earlier and less expressive version of C
++
.
Thoughtlessly applying techniques effective in one language to another typically leads to awk-
ward, poorly performing, and hard-to-maintain code. Such code is also most frustrating to write
because every line of code and every compiler error message reminds the programmer that the lan-
guage used differs from ‘‘the old language.’’ You can write in the style of Fortran, C, Smalltalk,
etc., in any language, but doing so is neither pleasant nor economical in a language with a different
philosophy. Every language can be a fertile source of ideas of how to write C
++
programs.
The C++ Programming Language, Special Edition by Bjarne Stroustrup. Copyright 2000 by AT&T.
Published by Addison Wesley, Inc. ISBN 0-201-70073-5. All rights reserved.
Section 1.2 Learning C
++
7
However, ideas must be transformed into something that fits with the general structure and type
system of C
++
in order to be effective in the different context. Over the basic type system of a lan-
guage, only Pyrrhic victories are possible.
C
++
supports a gradual approach to learning. How you approach learning a new programming
language depends on what you already know and what you aim to learn. There is no one approach
that suits everyone. My assumption is that you are learning C
++
to become a better programmer
and designer. That is, I assume that your purpose in learning C
++
is not simply to learn a new syn-
tax for doing things the way you used to, but to learn new and better ways of building systems.
This has to be done gradually because acquiring any significant new skill takes time and requires
practice. Consider how long it would take to learn a new natural language well or to learn to play a
new musical instrument well. Becoming a better system designer is easier and faster, but not as
much easier and faster as most people would like it to be.
It follows that you will be using C
++
– often for building real systems – before understanding
every language feature and technique. By supporting several programming paradigms (Chapter 2),
C
++
supports productive programming at several levels of expertise. Each new style of program-
ming adds another tool to your toolbox, but each is effective on its own and each adds to your
effectiveness as a programmer. C
++
is organized so that you can learn its concepts in a roughly lin-
ear order and gain practical benefits along the way. This is important because it allows you to gain
benefits roughly in proportion to the effort expended.
In the continuing debate on whether one needs to learn C before C
++
, I am firmly convinced
that it is best to go directly to C
++
. C
++
is safer, more expressive, and reduces the need to focus on
low-level techniques. It is easier for you to learn the trickier parts of C that are needed to compen-
sate for its lack of higher-level facilities after you have been exposed to the common subset of C
and C
++
and to some of the higher-level techniques supported directly in C
++
. Appendix B is a
guide for programmers going from C
++
to C, say, to deal with legacy code.
Several independently developed and distributed implementations of C
++
exist. A wealth of
tools, libraries, and software development environments are also available. A mass of textbooks,
manuals, journals, newsletters, electronic bulletin boards, mailing lists, conferences, and courses
are available to inform you about the latest developments in C
++
, its use, tools, libraries, implemen-
tations, etc. If you plan to use C
++
seriously, I strongly suggest that you gain access to such
sources. Each has its own emphasis and bias, so use at least two. For example, see [Barton,1994],
[Booch,1994], [Henricson,1997], [Koenig,1997], [Martin,1995].
1.3 The Design of C
++
Simplicity was an important design criterion: where there was a choice between simplifying the
language definition and simplifying the compiler, the former was chosen. However, great impor-
tance was attached to retaining a high degree of compatibility with C [Koenig,1989] [Strous-
trup,1994] (Appendix B); this precluded cleaning up the C syntax.
C
++
has no built-in high-level data types and no high-level primitive operations. For example,
the C
++
language does not provide a matrix type with an inversion operator or a string type with a
concatenation operator. If a user wants such a type, it can be defined in the language itself. In fact,
defining a new general-purpose or application-specific type is the most fundamental programming
The C++ Programming Language, Special Edition by Bjarne Stroustrup. Copyright 2000 by AT&T.
Published by Addison Wesley, Inc. ISBN 0-201-70073-5. All rights reserved.
8 Notes to the Reader Chapter 1
activity in C
++
. A well-designed user-defined type differs from a built-in type only in the way it is
defined, not in the way it is used. The C
++
standard library described in Part III provides many
examples of such types and their uses. From a user’s point of view, there is little difference
between a built-in type and a type provided by the standard library.
Features that would incur run-time or memory overheads even when not used were avoided in
the design of C
++
. For example, constructs that would make it necessary to store ‘‘housekeeping
information’’ in every object were rejected, so if a user declares a structure consisting of two 16-bit
quantities, that structure will fit into a 32-bit register.
C
++
was designed to be used in a traditional compilation and run-time environment, that is, the
C programming environment on the UNIX system. Fortunately, C
++
was never restricted to UNIX;
it simply used UNIX and C as a model for the relationships between language, libraries, compilers,
linkers, execution environments, etc. That minimal model helped C
++
to be successful on essen-
tially every computing platform. There are, however, good reasons for using C
++
in environments
that provide significantly more support. Facilities such as dynamic loading, incremental compila-
tion, and a database of type definitions can be put to good use without affecting the language.
C
++
type-checking and data-hiding features rely on compile-time analysis of programs to pre-
vent accidental corruption of data. They do not provide secrecy or protection against someone who
is deliberately breaking the rules. They can, however, be used freely without incurring run-time or
space overheads. The idea is that to be useful, a language feature must not only be elegant; it must
also be affordable in the context of a real program.
For a systematic and detailed description of the design of C
++
, see [Stroustrup,1994].
1.3.1 Efficiency and Structure
C
++
was developed from the C programming language and, with few exceptions, retains C as a
subset. The base language, the C subset of C
++
, is designed to ensure a very close correspondence
between its types, operators, and statements and the objects that computers deal with directly: num-
bers, characters, and addresses. Except for the n ne ew w, d de el le et te e, t ty yp pe ei id d, d dy yn na am mi ic c_ _c ca as st t, and t th hr ro ow w oper-
ators and the try-block, individual C
++
expressions and statements need no run-time support.
C
++
can use the same function call and return sequences as C – or more efficient ones. When
even such relatively efficient mechanisms are too expensive, a C
++
function can be substituted
inline, so that we can enjoy the notational convenience of functions without run-time overhead.
One of the original aims for C was to replace assembly coding for the most demanding systems
programming tasks. When C
++
was designed, care was taken not to compromise the gains in this
area. The difference between C and C
++
is primarily in the degree of emphasis on types and struc-
ture. C is expressive and permissive. C
++
is even more expressive. However, to gain that increase
in expressiveness, you must pay more attention to the types of objects. Knowing the types of
objects, the compiler can deal correctly with expressions when you would otherwise have had to
specify operations in painful detail. Knowing the types of objects also enables the compiler to
detect errors that would otherwise persist until testing – or even later. Note that using the type sys-
tem to check function arguments, to protect data from accidental corruption, to provide new types,
to provide new operators, etc., does not increase run-time or space overheads in C
++
.
The emphasis on structure in C
++
reflects the increase in the scale of programs written since C
was designed. You can make a small program (say, 1,000 lines) work through brute force even
The C++ Programming Language, Special Edition by Bjarne Stroustrup. Copyright 2000 by AT&T.
Published by Addison Wesley, Inc. ISBN 0-201-70073-5. All rights reserved.
Section 1.3.1 Efficiency and Structure 9
when breaking every rule of good style. For a larger program, this is simply not so. If the structure
of a 100,000-line program is bad, you will find that new errors are introduced as fast as old ones are
removed. C
++
was designed to enable larger programs to be structured in a rational way so that it
would be reasonable for a single person to cope with far larger amounts of code. In addition, the
aim was to have an average line of C
++
code express much more than the average line of C or Pas-
cal code. C
++
has by now been shown to over-fulfill these goals.
Not every piece of code can be well-structured, hardware-independent, easy-to-read, etc. C
++
possesses features that are intended for manipulating hardware facilities in a direct and efficient
way without regard for safety or ease of comprehension. It also possesses facilities for hiding such
code behind elegant and safe interfaces.
Naturally, the use of C
++
for larger programs leads to the use of C
++
by groups of program-
mers. C
++
’s emphasis on modularity, strongly typed interfaces, and flexibility pays off here. C
++
has as good a balance of facilities for writing large programs as any language has. However, as
programs get larger, the problems associated with their development and maintenance shift from
being language problems to more global problems of tools and management. Part IV explores
some of these issues.
This book emphasizes techniques for providing general-purpose facilities, generally useful
types, libraries, etc. These techniques will serve programmers of small programs as well as pro-
grammers of large ones. Furthermore, because all nontrivial programs consist of many semi-
independent parts, the techniques for writing such parts serve programmers of all applications.
You might suspect that specifying a program by using a more detailed type structure would lead
to a larger program source text. With C
++
, this is not so. A C
++
program declaring function argu-
ment types, using classes, etc., is typically a bit shorter than the equivalent C program not using
these facilities. Where libraries are used, a C
++
program will appear much shorter than its C equiv-
alent, assuming, of course, that a functioning C equivalent could have been built.
1.3.2 Philosophical Note
A programming language serves two related purposes: it provides a vehicle for the programmer to
specify actions to be executed, and it provides a set of concepts for the programmer to use when
thinking about what can be done. The first purpose ideally requires a language that is ‘‘close to the
machine’’ so that all important aspects of a machine are handled simply and efficiently in a way
that is reasonably obvious to the programmer. The C language was primarily designed with this in
mind. The second purpose ideally requires a language that is ‘‘close to the problem to be solved’’
so that the concepts of a solution can be expressed directly and concisely. The facilities added to C
to create C
++
were primarily designed with this in mind.
The connection between the language in which we think/program and the problems and solu-
tions we can imagine is very close. For this reason, restricting language features with the intent of
eliminating programmer errors is at best dangerous. As with natural languages, there are great ben-
efits from being at least bilingual. A language provides a programmer with a set of conceptual
tools; if these are inadequate for a task, they will simply be ignored. Good design and the absence
of errors cannot be guaranteed merely by the presence or the absence of specific language features.
The type system should be especially helpful for nontrivial tasks. The C
++
class concept has, in
fact, proven itself to be a powerful conceptual tool.
The C++ Programming Language, Special Edition by Bjarne Stroustrup. Copyright 2000 by AT&T.
Published by Addison Wesley, Inc. ISBN 0-201-70073-5. All rights reserved.
剩余1021页未读,继续阅读
2010-05-30 上传
2013-05-04 上传
2023-11-20 上传
2023-11-15 上传
2024-01-02 上传
2023-11-18 上传
2024-01-02 上传
2023-07-13 上传
2023-10-21 上传
韩半仙
- 粉丝: 430
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WPF渲染层字符绘制原理探究及源代码解析
- 海康精简版监控软件:iVMS4200Lite版发布
- 自动化脚本在lspci-TV的应用介绍
- Chrome 81版本稳定版及匹配的chromedriver下载
- 深入解析Python推荐引擎与自然语言处理
- MATLAB数学建模算法程序包及案例数据
- Springboot人力资源管理系统:设计与功能
- STM32F4系列微控制器开发全面参考指南
- Python实现人脸识别的机器学习流程
- 基于STM32F103C8T6的HLW8032电量采集与解析方案
- Node.js高效MySQL驱动程序:mysqljs/mysql特性和配置
- 基于Python和大数据技术的电影推荐系统设计与实现
- 为ripro主题添加Live2D看板娘的后端资源教程
- 2022版PowerToys Everything插件升级,稳定运行无报错
- Map简易斗地主游戏实现方法介绍
- SJTU ICS Lab6 实验报告解析
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功