Thinking in C++ Volume 1 - Introduction to Standard C++ |
|||
|
ISBN : 0139798099 |
|||
![]() Cover Design - Thinking in C++ Volume 1 - Introduction to Standard C++ |
For your free electronic copy of this book please verify the numbers below. (We need to do this to make sure you're a person and not a malicious script) | ||
|
Sample Chapter From Thinking in C++ Volume 1 - Introduction to Standard C++ Copyright © Bruce Eckel |
|||
1: Introduction to ObjectsThe genesis of the
computer revolution was in a machine. The genesis of our programming
languages thus tends to look like that machine. But computers are not so much machines
as they are mind amplification tools (“bicycles for the
mind,” as Steve Jobs is fond of saying) and a different kind
of expressive medium. As a result, the tools are beginning to look less
like machines and more like parts of our minds, and also like other
expressive mediums such as writing, painting, sculpture, animation, and
filmmaking. Object-oriented programming is part of this movement toward
using the computer as an expressive medium. This chapter will introduce you to the
basic concepts of object-oriented programming (OOP), including an
overview of OOP development methods. This chapter, and this book,
assume that you have had experience in a procedural programming
language, although not necessarily C. If you think you need more
preparation in programming and the syntax of C before tackling this
book, you should work through the “Thinking in C: Foundations
for C++ and Java” training CD ROM, bound in with this book
and also available at www.BruceEckel.com.
This chapter is background and
supplementary material. Many people do not feel comfortable wading into
object-oriented programming without understanding the big picture
first. Thus, there are many concepts that are introduced here to give
you a solid overview of OOP. However, many other people don’t
get the big picture concepts until they’ve seen some of the
mechanics first; these people may become bogged down and lost without
some code to get their hands on. If you’re part of this
latter group and are eager to get to the specifics of the language,
feel free to jump past this chapter – skipping it at this
point will not prevent you from writing programs or learning the
language. However, you will want to come back here eventually to fill
in your knowledge so you can understand why objects are important and
how to design with them. The progress of abstractionAll programming languages provide
abstractions. It can be argued that the complexity of the problems
you’re able to solve is directly related to the kind and
quality of abstraction. By “kind” I mean,
“What is it that you are abstracting?” Assembly
language is a small abstraction of the underlying machine. Many
so-called “imperative” languages that followed
(such as Fortran, BASIC, and C) were abstractions of assembly language.
These languages are big improvements over assembly language, but their
primary abstraction still requires you to think in terms of the
structure of the computer rather than the structure of the problem you
are trying to solve. The programmer must establish the association
between the machine model (in the “solution space,”
which is the place where you’re modeling that problem, such
as a computer) and the model of the problem that is actually being
solved (in the “problem space,” which is the place
where the problem exists). The effort required to perform this mapping,
and the fact that it is extrinsic to the programming language, produces
programs that are difficult to write and expensive to maintain, and as
a side effect created the entire “programming
methods” industry. The alternative to modeling the
machine is to model the problem you’re trying to solve. Early
languages such as LISP and APL chose particular views of the world
(“All problems are ultimately lists” or
“All problems are algorithmic”). PROLOG casts all
problems into chains of decisions. Languages have been created for
constraint-based programming and for programming exclusively by
manipulating graphical symbols. (The latter proved to be too
restrictive.) Each of these approaches is a good solution to the
particular class of problem they’re designed to solve, but
when you step outside of that domain they become awkward. The object-oriented approach goes a
step farther by providing tools for the programmer to represent
elements in the problem space. This representation is general enough
that the programmer is not constrained to any particular type of
problem. We refer to the elements in the problem space and their
representations in the solution space as “objects.”
(Of course, you will also need other objects that don’t have
problem-space analogs.) The idea is that the program is allowed to
adapt itself to the lingo of the problem by adding new types of
objects, so when you read the code describing the solution,
you’re reading words that also express the problem. This is a
more flexible and powerful language abstraction than what
we’ve had before. Thus, OOP allows you to describe the
problem in terms of the problem, rather than in terms of the computer
where the solution will run. There’s still a connection back
to the computer, though. Each object looks quite a bit like a little
computer; it has a state, and it has operations that you can ask it to
perform. However, this doesn’t seem like such a bad analogy
to objects in the real world; they all have characteristics and
behaviors.
|
|||