CONTENTS

Chapter 1. GETTING STARTED

You will learn about the following in this chapter:

Welcome to C++! This exciting language, blending the C language with support for object-oriented programming, became one of the most important programming languages of the 1990s and continues strongly into the 2000s. Its C ancestry brings to C++ the tradition of an efficient, compact, fast, and portable language. Its object-oriented heritage brings C++ a fresh programming methodology designed to cope with the escalating complexity of modern programming tasks. Its template features bring yet another new programming methodology, generic programming. This triple heritage is both a blessing and a bane. It makes the language very powerful, but it also means there's more to learn.

In this chapter we'll explore C++'s background further and then go over some of the ground rules for creating C++ programs. The rest of the book teaches you to use the C++ language, going from the modest basics of the language to the glory of object-oriented programming (OOP) and its supporting cast of new jargon梠bjects, classes, encapsulation, data hiding, polymorphism, and inheritance, then on to its support of generic programming. (Of course, as you learn C++, these terms will be transformed from buzzwords to the necessary vocabulary of cultivated discourse.)

Learning C++

C++ joins three separate programming traditions梩he procedural language tradition, represented by C; the object-oriented language tradition, represented by the class enhancements C++ adds to C; and generic programming, supported by C++ templates. This chapter will look into those traditions shortly. But first, let's consider what this heritage implies about learning C++. One reason to use C++ is to avail yourself of its object-oriented features. To do so, you need a sound background in standard C, for that language provides the basic types, operators, control structures, and syntax rules. So, if you already know C, you're poised to learn C++. But it's not just a matter of learning a few more keywords and constructs. Going from C to C++ involves about as much work as learning C in the first place. Also, if you know C, you must unlearn some programming habits as you make the transition to C++. If you don't know C, you have to master the C components, the OOP components, and the generic components to learn C++, but at least you may not have to unlearn programming habits. If you are beginning to think that learning C++ may involve some mind-stretching effort on your part, you're right. This book will guide you through the process in a clear, helpful manner, one step at a time, so the mind-stretching will be sufficiently gentle to leave your brain resilient.

C++ Primer Plus approaches C++ by teaching both its C basis and its new components, so this book assumes you have no prior knowledge of C. You'll start by learning the features C++ shares with C. Even if you know C, you may find this part of the book a good review. Also, it points out concepts that will become important later, and it indicates where C++ differs from C. After you are well-founded in the basics of C, you'll add the C++ superstructure. At this point you'll learn about objects and classes and how C++ implements them. And you will learn about templates.

This book is not intended to be a complete C++ reference; it won't explore every nook and cranny of the language. But you will learn all the major features of the language, including some, like templates, exceptions, and namespaces, that are more recent additions.

Now let's take a brief look at some of C++'s background.

A Little History

Computer technology has evolved at an amazing rate during the last few decades. Today a laptop computer can compute faster and store more information than the mainframe computers of thirty years ago. (Quite a few programmers can recall bearing offerings of decks of punched cards to be submitted to a mighty, room-filling computer system with a majestic 100KB of memory梟ot enough memory to run a good personal computer game today.) Computer languages have evolved, too. The changes may not be as dramatic, but they are important. Bigger, more powerful computers spawn bigger, more complex programs which, in turn, raise new problems in program management and maintenance.

In the 1970s, languages like C and Pascal helped usher in an era of structured programming, a philosophy that brought some order and discipline to a field badly in need of these qualities. Besides providing the tools for structured programming, C also produced compact, fast-running programs along with the ability to address hardware matters, such as managing communication ports and disk drives. These gifts helped make C the dominant programming language in the 1980s. Meanwhile, the 1980s witnessed the growth of a new programming paradigm: object-oriented programming, or OOP, as embodied in languages such as SmallTalk and C++. Let's examine these two developments (C and OOP) a bit more closely.

The C Language

In the early 1970s, Dennis Ritchie of Bell Laboratories was working on a project to develop the UNIX operating system. (An operating system is a set of programs that manages a computer's resources and handles its interactions with users. For example, it's the operating system that puts the system prompt onscreen and that runs programs for you.) For this work Ritchie needed a language that was concise, that produced compact, fast programs, and that could control hardware efficiently. Traditionally, programmers met these needs by using assembly language, which is closely tied to a computer's internal machine language. However, assembly language is a low-level language, that is, it is specific to a particular computer processor. So if you want to move an assembly program to a different kind of computer, you may have to completely rewrite the program using a different assembly language. It was a bit as if each time you bought a new car, you found that the designers decided to change where the controls went and what they did, forcing you to relearn how to drive. But UNIX was intended to work on a variety of computer types (or platforms). That suggested using a high-level language. A high-level language is oriented towards problem-solving instead of towards specific hardware. Special programs called compilers translate a high-level language to the internal language of a particular computer. Thus, you can use the same high-level language program on different platforms by using a separate compiler for each platform. Ritchie wanted a language that combined low-level efficiency and hardware access with high-level generality and portability. So, building from older languages, he created C.

C Programming Philosophy

Because C++ grafts a new programming philosophy onto C, we should first take a look at the older philosophy that C follows. In general, computer languages deal with two concepts梔ata and algorithms. The data constitute the information a program uses and processes. The algorithms are the methods the program uses (see Figure 1.1). C, like most mainstream languages to date, is a procedural language. That means it emphasizes the algorithm side of programming. Conceptually, procedural programming consists of figuring out the actions a computer should take and then using the programming language to implement those actions. A program prescribes a set of procedures for the computer to follow to produce a particular outcome, much as a recipe prescribes a set of procedures for a cook to follow to produce a cake.

Figure 1.1. Data + algorithms = program.

graphics/01fig01.gif

Earlier procedural languages, such as FORTRAN and BASIC, ran into organizational problems as programs grew larger. For example, programs often use branching statements, which route execution to one or another set of instructions depending upon the result of some sort of test. Many older programs had such tangled routing (called "spaghetti programming") that it was virtually impossible to understand a program by reading it, and modifying such a program was an invitation to disaster. In response, computer scientists developed a more disciplined style of programming called structured programming. C includes features to facilitate this approach. For example, structured programming limits branching (choosing which instruction to do next) to a small set of well-behaved constructions. C incorporates these constructions (the for loop, the while loop, the do while loop, and the if else statement) into its vocabulary.

Top-down design was another of the new principles. The idea is to break a large program into smaller, more manageable tasks. If one of these tasks is still too broad, divide it into yet smaller tasks. Continue with this process until the program is compartmentalized into small, easily programmed modules. (Organize your study. Aargh! Well, organize your desk, your table top, your filing cabinet, and your bookshelves. Aargh! Well, start with the desk and organize each drawer, starting with the middle one. Hmmm, perhaps I can manage that task.) C's design facilitates this approach, encouraging you to develop program units called functions to represent individual task modules. As you may have noticed, the structured programming techniques reflect a procedural mind-set, thinking of a program in terms of the actions it performs.

Object-Oriented Programming

Although the principles of structured programming improved the clarity, reliability, and ease of maintenance of programs, large-scale programming still remains a challenge. Object-oriented programming (OOP) brings a new approach to that challenge. Unlike procedural programming, which emphasizes algorithms, OOP emphasizes the data. Rather than trying to fit a problem to the procedural approach of a language, OOP attempts to fit the language to the problem. The idea is to design data forms that correspond to the essential features of a problem.

In C++, a class is a specification describing such a new data form, and an object is a particular data structure constructed according to that plan. For example, a class could describe the general properties of a corporation executive (name, title, salary, unusual abilities, for example), while an object would represent a specific executive (Guilford Sheepblat, vice president, $325,000, knows how to use a CONFIG.SYS file). In general, a class defines what data are used to represent an object and the operations that can be performed upon that data. For example, suppose you were developing a computer drawing program capable of drawing a rectangle. You could define a class to describe a rectangle. The data part of the specification could include such things as the location of the corners, the height and width, the color and style of the boundary line, and the color and pattern used to fill the rectangle. The operations part of the specification could include methods for moving the rectangle, resizing it, rotating it, changing colors and patterns, and copying the rectangle to another location. If you then use your program to draw a rectangle, it will create an object according to the class specification. That object will hold all the data values describing the rectangle, and you can use the class methods to modify that rectangle. If you draw two rectangles, the program will create two objects, one for each rectangle.

The OOP approach to program design is to first design classes that accurately represent those things with which the program deals. A drawing program, for example, might define classes to represent rectangles, lines, circles, brushes, pens, and the like. The class definitions, recall, include a description of permissible operations for each class, such as moving a circle or rotating a line. Then you proceed to design a program using objects of those classes. The process of going from a lower level of organization, such as classes, to a higher level, such as program design, is called bottom-up programming.

There's more to OOP programming than the binding of data and methods into a class definition. OOP, for example, facilitates creating reusable code, and that eventually can save a lot of work. Information hiding safeguards data from improper access. Polymorphism lets you create multiple definitions for operators and functions, with the programming context determining which definition is used. Inheritance lets you derive new classes from old ones. As you can see, object-oriented programming introduces many new ideas and involves a different approach to programming than does procedural programming. Instead of concentrating on tasks, you concentrate on representing concepts. Instead of taking a top-down programming approach, you sometimes take a bottom-up approach. This book will guide you through all these points with plenty of easily grasped examples.

Designing a useful, reliable class can be a difficult task. Fortunately, OOP languages make it simple to incorporate existing classes into your own programming. Vendors provide a variety of useful class libraries, including libraries of classes designed to simplify creating programs for environments such as Windows or the Macintosh. One of the real benefits of C++ is that it lets you easily reuse and adapt existing, well-tested code.

Generic Programming

Generic programming is yet another programming paradigm supported by C++. It shares with OOP the aim of making it simpler to reuse code and the technique of abstracting general concepts. But while OOP emphasizes the data aspect of programming, generic programming emphasizes the algorithmic aspect. And its focus is different. OOP is a tool for managing large projects, while generic programming provides tools for performing common tasks, such as sorting data or merging lists. The term generic means to create code that is type-independent. C++ data representations come in many types梚ntegers, numbers with fractional parts, characters, strings of characters, user-defined compound structures of several types. If, for example, you wanted to sort data of these various types, you normally have to create a separate sorting function for each type. Generic programming involves extending the language so that you can write a function for a generic (that is, not specified) type once, and use it for a variety of actual types. C++ templates provide a mechanism for doing that.

C++

Like C, C++ began its life at Bell Labs, where Bjarne Stroustrup developed the language in the early 1980s. In his own words, "C++ was designed primarily so that my friends and I would not have to program in assembler, C, or various modern high-level languages. Its main purpose was to make writing good programs easier and more pleasant for the individual programmer" (Bjarne Stroustrup, The C++ Programming Language. Third Edition. Reading, MA: Addison-Wesley Publishing Company, 1997).

Stroustrup was more concerned with making C++ useful than with enforcing particular programming philosophies or styles. Real programming needs are more important than theoretical purity in determining C++ language features. Stroustrup based C++ on C because of C's brevity, its suitability to system programming, its widespread availability, and its close ties to the UNIX operating system. C++'s OOP aspect was inspired by a computer simulation language called Simula67. Stroustrup added OOP features and generic programming support to C without significantly changing the C component. Thus C++ is a superset of C, meaning that any valid C program is a valid C++ program, too. There are some minor discrepancies, but nothing crucial. C++ programs can use existing C software libraries. Libraries are collections of programming modules that you can call up from a program. They provide proven solutions to many common programming problems, thus saving you much time and effort. This has helped the spread of C++.

The name C++ comes from the C increment operator ++, which adds 1 to the value of a variable. The name C++ correctly suggests an augmented version of C.

A computer program translates a real-life problem into a series of actions to be taken by a computer. While the OOP aspect of C++ gives the language the ability to relate to concepts involved in the problem, the C part of C++ gives the language the ability to get close to the hardware (see Figure 1.2). This combination of abilities has helped the spread of C++. It may also involve a mental shift of gears as you turn from one aspect of a program to another. (Indeed, some OOP purists regard adding OOP features to C akin to adding wings to a pig, albeit a lean, efficient pig.) Also, because C++ grafts OOP onto C, you can ignore C++'s object-oriented features. But you'll miss a lot if that's all you do.

Figure 1.2. C++ duality.

graphics/01fig02.gif

Only after C++ achieved some success did Stroustrup add templates, enabling generic programming. And only after the template feature had been used and enhanced did it become apparent that they were perhaps as significant an addition as OOP梠r even more significant, some would argue. The fact that C++ incorporates both OOP and generic programming, as well as the more traditional procedural approach demonstrates that C++ emphasizes the utilitarian over the ideological approach, and that is one of the reasons for the language's success.

Portability and Standards

You've written a handy C++ program for the elderly 286 PC AT computer at work when management decides to replace the machine with a Sun workstation, a computer using a different processor and a different operating system. Can you run your program on the new platform? Of course, you'll have to recompile the program using a C++ compiler designed for the new platform. But will you have to make any changes to the code you wrote? If you can recompile the program without making changes and it runs without a hitch, we say the program is portable.

There are a couple of obstacles to portability, the first of which is hardware. A program that is hardware-specific is not likely to be portable. One that takes direct control of an IBM PC VGA video board, for example, will be speaking gibberish as far as a Sun is concerned. (You can minimize portability problems by localizing the hardware-dependent parts in function modules; then you just have to rewrite those specific modules.) We will avoid that sort of programming in this book.

The second obstacle to portability is language divergence. Certainly, that can be a problem with spoken languages. A Yorkshireman's description of the day's events may not be portable to Brooklyn, even though English is spoken in both areas. Computer languages, too, can develop dialects. Is the IBM PC C++ implementation the same as the Sun implementation? Although most implementers would like to make their versions of C++ compatible with others, it's difficult to do so without a published standard describing exactly how the language works. Therefore, the American National Standards Institute (ANSI) created a committee in 1990(ANSI X3J16) to develop a standard for C++. (ANSI already has developed a standard for C.) The International Standardization Organization (ISO) soon joined the process with its own committee (ISO-WG-21), creating a joint ANSI/ISO effort to develop the C++ standard. These committees met jointly three times a year, and we'll simply lump them together notationally as the ANSI/ISO committee. ANSI/ISO's decision to create a standard emphasizes that C++ has become an important and widespread language. It also indicates C++ has reached a certain level of maturity, for it's not productive to introduce standards while a language is developing rapidly. Nonetheless, C++ has undergone significant changes since the committee began its work.

Work on the ANSI/ISO C++ standard began in 1990. The committee issued some interim working papers in the following years. In April 1995 it released a Committee Draft (CD) for public comment. In December 1996 it released a second version (CD2) for further public review. These documents not only refined the description of existing C++ features but also extended the language with exceptions, RTTI, templates, and the Standard Template Library. The final International Standard (ISO/IEC 14882:1998) was adopted in 1998 by the ISO, IEC (International Electrotechnical Committee), and ANSI. This book is based on that standard.

The ANSI/ISO C++ standard additionally draws upon the ANSI C standard, because C++ is supposed to be, as far as possible, a superset of C. That means any valid C program ideally should also be a valid C++ program. There are a few differences between ANSI C and the corresponding rules for C++, but they are minor. Indeed, ANSI C incorporates some features first introduced in C++, such as function prototyping and the const type qualifier.

Prior to the emergence of ANSI C, the C community followed a de facto standard based on the book The C Programming Language, by Kernighan and Ritchie (Addison-Wesley Publishing Company Reading, MA. 1978). This standard often was termed K&R C; with the emergence of ANSI C, the simpler K&R C now sometimes is called classic C.

The ANSI C standard not only defines the C language, it also defines a standard C library that ANSI C implementations must support. C++ also uses that library; this book will refer to it as the standard C library or the standard library. In addition, the ANSI/ISO C++ standard provides a standard library of C++ classes.

More recently, the C standard has been revised; the new standard, sometimes called C99, was adopted by ISO in 1999 and ANSI in 2000. The standard adds some features to C, such as a new integer type, that some C++ compilers support. Although not part of the current C++ standard, these features may become part of the next C++ standard.

Before the ANSI/ISO C++ committee began its work, many people accepted the most recent Bell Labs version of C++ as a standard. For example, a compiler might describe itself as compatible with Release 2.0 or Release 3.0 of C++.

Before getting to the C++ language proper, let's cover some of the groundwork about creating programs and about using this book.

The Mechanics of Creating a Program

Suppose you've written a C++ program. How do you get it running? The exact steps depend upon your computer environment and the particular C++ compiler you use, but they will resemble the following steps (see Figure 1.3):

Figure 1.3. Programming steps.

graphics/01fig03.gif

You will encounter the term source code throughout the book, so be sure to file it away in your personal random-access memory.

The programs in this book are generic and should run in any system supporting modern C++. (However, you may need one of the latest versions to get support for namespaces and the newest template features.) The steps for putting a program together may differ. Let's look a little further at these steps.

Creating the Source Code

Some C++ implementations, such as Microsoft Visual C++, Borland C++ (various versions), Watcom C++, Symantec C++, and Metrowerks CodeWarrior, provide integrated development environments (IDEs) that let you manage all steps of program development, including editing, from one master program. Other implementations, such as AT&T C++ or GNU C++ on UNIX and Linux, just handle the compilation and linking stages and expect you to type commands on the system command line. In such cases, you can use any available text editor to create and modify source code. On UNIX, for example, you can use vi or ed or ex or emacs. On a DOS system, you can use edlin or edit or any of several available program editors. You can even use a word processor, providing you save the file as a standard DOS ASCII text file instead of in a special word processor format.

In naming a source file, you must use the proper suffix to identify the file as a C++ file. This not only tells you the file is C++ source code, it tells the compiler that, too. (If a UNIX compiler complains to you about a "bad magic number," that's just its endearingly obscure way of saying that you used the wrong suffix.) The suffix consists of a period followed by a character or group of characters called the extension (see Figure 1.4).

Figure 1.4. Source file extension.

graphics/01fig04.gif

The extension you use depends on the C++ implementation. Table 1.1 shows some common choices. For example, spiffy.C is a valid AT&T C++ source code filename. Note that UNIX is case sensitive, meaning you should use an uppercase C character. Actually, a lowercase c extension also works, but standard C uses that extension. So, to avoid confusion on UNIX systems, use c with C programs and C with C++ programs. If you don't mind typing an extra character or two, you can also use cc and cxx extensions with some UNIX systems. DOS, being a bit simple-minded compared to UNIX, doesn't distinguish between uppercase and lowercase, so DOS implementations use additional letters, as shown in Table 1.1, to distinguish between C and C++ programs.

Table 1.1. Source Code Extensions
C++ Implementation Source Code Extension
UNIX AT&T C, cc, cxx, c
GNU C++ C, cc, cxx, cpp
Symantec cpp, cp
Borland C++ cpp
Watcom cpp
Microsoft Visual C++ cpp, cxx
Metrowerks CodeWarrior cp, cpp

Compilation and Linking

Originally, Stroustrup implemented C++ with a C++-to-C compiler program instead of developing a direct C++-to-object code compiler. This program, called cfront (for C front end), translated C++ source code to C source code, which could then be compiled by a standard C compiler. This approach simplified introducing C++ to the C community. Other implementations have used this approach to bring C++ to other platforms. As C++ has developed and grown in popularity, more and more implementers have turned to creating C++ compilers that generate object code directly from C++ source code. This direct approach speeds up the compilation process and emphasizes that C++ is a separate, if similar, language.

Often the distinction between a cfront translator and compiler is nearly invisible to the user. For example, on a UNIX system the CC command may first pass your program to the cfront translator and then automatically pass the translator's output on to the C compiler, which is called cc. Henceforth, we'll use the term "compiler" to include translate-and-compile combinations. The mechanics of compiling depend upon the implementation, and the following sections outline a few common forms. These summaries outline the basic steps, but they are no substitute for consulting the documentation for your system.

If you have access to the cfront translator and know C, you may want to inspect the C translations of your C++ programs and get an inside look at how some C++ features are implemented.

UNIX Compiling and Linking

Suppose, for example, that you are on a UNIX system using AT&T Release 3.0 C++. Use the CC command to compile your program. The name is in uppercase letters to distinguish it from the standard UNIX C compiler cc. The CC compiler is a command-line compiler, meaning you type compilation commands on the UNIX command line.

For example, to compile the C++ source code file spiffy.C, you would type this command at the UNIX prompt:

CC spiffy.C

If, through skill, dedication, or luck, your program has no errors, the compiler generates an object code file with an o extension. In this case, the compiler would produce a spiffy.o file.

Next, the compiler automatically passes the object code file to the system linker, a program that combines your code with library code to produce the executable file. By default, the executable file is called a.out. If you used just one source file, the linker also deletes the spiffy.o file, because it's no longer needed. To run the program, just type the name of the executable file:

a.out

Note that if you compile a new program, the new a.out executable file replaces the previous a.out. (That's because executable files take a lot of space, so overwriting old executable files helps reduce storage demands.) But if you develop an executable program you want to keep, just use the UNIX mv command to change the name of the executable file.

In C++, as in C, you can spread a program over more than one file. (Many of the programs in this book from Chapters 8?a class="docLink" href="_chapter%2016.htm">16 do this.) In that case, you can compile a program by listing all the files on the command line:

CC my.C precious.C

If there are multiple source code files, the compiler does not delete the object code files. That way, if you just change the my.C file, you can recompile the program with this command:

CC my.C precious.o

This recompiles the my.C file and links it with the previously compiled precious.o file.

You might have to identify some libraries explicitly. For example, to access functions defined in the math library, you may have to add the -lm flag to the command line.

CC usingmath.C -lm
Linux Compiling and Linking

Linux systems most commonly use g++, the GNU C++ compiler from the Free Software Foundation. The compiler is included in most Linux distributions, but may not always be installed. The g++ compiler works much like the standard UNIX compiler:

g++ spiffy.cxx

This produces an executable file call a.out.

Some versions might require that you link in the C++ library:

g++ spiffy.cxx -lg++

To compile multiple source files, just list them all in the command line:

g++ my.cxx precious.cxx

This produces an executable file called a.out and two object code files my.o and precious.o. If you subsequently modify just one of the source code files, say my.cxx, you can recompile using my.cxx and the precious.o:

g++ my.cxx precious.o

The Comeau C++ compiler (www.comeaucomputing.com) is another possibility; it requires the presence of the GNU compiler.

The GNU compiler is available for many platforms, including MS-DOS running on IBM- compatible PCs as well as UNIX systems on a variety of platforms.

Command-Line Compilers for MS-DOS

The most inexpensive route for compiling C++ programs on a Windows PC is to download a free command-line compiler that runs in a Windows MS-DOS window. The MS-DOS version of the GNU C++ is called gpp, and is available at www.delorie.com/djgpp/. Borland provides a free command-line compiler at www.borland.com/bcppbuilder/freecompiler/. For either, you need to read the installation directions, for parts of the installation processes are not automatic.

To use the gpp compiler, first open an MS-DOS window. To compile a source code file named great.cpp, type the following command at the prompt:

gpp great.cpp

If the program compiles successfully, the resulting executable file is named a.exe.

To use the Borland compiler, first open an MS-DOS window. To compile a source code file named great.cpp, type the following command at the prompt:

bcc32 great.cpp

If the program compiles successfully, the resulting executable file is named great.exe.

Windows Compilers

Windows products are too abundant and too often revised to make it reasonable to describe them all individually. However, they do share some common features.

Typically, you must create a project for a program and add the file or files constituting your program to the project. Each vendor will supply an IDE (Integrated Development Environment) with menu options and, possibly, automated assistance, in creating a project. One very important matter you have to establish is the kind of program you're creating. Typically, the compiler will offer many choices, such as a Windows application, an MFC Windows application, a dynamic-link library, an ActiveX control, a DOS or character-mode executable, a static library, or a console application. Some of these may be available in both 16-bit and 32-bit versions.

Because the programs in this book are generic, you should avoid choices that require platform-specific code, such as Windows applications. Instead, you want to run in a character-based mode. The choice will depend on the compiler. For Microsoft Visual C++, use the Win32 Console Application option. Metrowerks compilers offer a Win32 Console C++ App option and a Win32 WinSIOUX C++ App option, either of which work. (The former runs the compiled program in a DOS window, the latter runs it in a standard Windows window.) Some Borland versions feature an EasyWin choice that emulates a DOS session; other versions offer a Console option. In general, look to see if there is an option labeled Console, character-mode, or DOS executable, and try that.

After you have the project set up, you'll have to compile and link your program. The IDE typically will give you several choices such as Compile, Build, Make, Build All, Link, Execute, and Run (but not necessarily all these choices in the same IDE!).

A compiler generates an error message when you violate a language rule and identifies the line with the problem. Unfortunately, when you are new to a language, you may find it difficult to understand the message. Sometimes the actual error may occur before the identified line, and sometimes a single error will generate a chain of error messages.

Tip

graphics/bulb.gif

When fixing errors, fix the first error first. If you can't find it on the line identified as the line with the error, check the preceding line.

Tip

graphics/bulb.gif

Occasionally compilers get confused after incompletely building a program and respond by giving meaningless error messages that cannot be fixed. In such cases, you can clear things up by selecting Build All to restart the process from scratch. Unfortunately, it is difficult to distinguish this situation from the more common one in which the error messages merely seem to be meaningless.

Usually, the IDE will let you run the program in an auxiliary window. Some IDEs close the window as soon as the program finishes execution, some leave it open. If your compiler closes the window, you'll have a hard time seeing the output, unless you have quick eyes and a photographic memory. To see the output, you must place some additional code at the end of the program:

      cin.get();  // add this statement
      cin.get();  // and maybe this, too
      return 0;
}

The cin.get() statement reads the next keystroke, so this statement causes the program to wait until you press the Enter key. (No keystrokes get sent to a program until you press Enter, so there's no point in pressing another key.) The second statement is needed if the program otherwise leaves an unprocessed keystroke after its regular input. For example, if you enter a number, you'll type the number and then press Enter. The program will read the number but leave the Enter keystroke unprocessed, and it then will be read by the first cin.get().

The Borland C++Builder compiler departs a bit from more traditional designs. Its primary aim is Windows programming. To use it for generic programs, select New from the File menu. Then select Console App. A window will open that includes a skeleton version of main(). Some of the items you can delete, but you should retain the following two nonstandard lines:

#include <vcl\ condefs.h>
#pragma hdrstop
C++ on the Macintosh

The primary Macintosh C++ compiler is Metrowerks CodeWarrior. It provides project-based IDEs similar, in basic concepts, to what you would find in a Windows compiler. Start by selecting New Project from the File menu. You'll be given a choice of project types. For CodeWarrior, choose MacOS:C/C++:ANSI C++ Console in older versions, MacOS:C/C++:Standard Console:Std C++ Console in more recent versions. You also may have to choose between a 68K version (for the Motorola 680X0 series of processors) or a PPC version (for the PowerPC processors).

CodeWarrior supplies a small source code file as part of the initial project. You can try compiling and running that program to see if you have your system set up properly. However, once you provide your own code, you should delete this file from the project. Do so by highlighting the file in the project window and then selecting Remove from the Project menu.

Next, you must add your source code to the project. You can use New from the File menu to create a new file or Open from the File menu to open an existing file. Use a proper suffix, such as .cp or .cpp. Use the Project menu to add this file to the project list. Some programs in this book require that you add more than one source code file. When you are ready, select Run from the Project menu.

Tip

graphics/bulb.gif

To save time, you can use just one project for all the sample programs. Delete the previous example source code file from the project list and add the current source code. This saves disk space.

The compiler includes a debugger to help you locate the causes of runtime problems.

Conventions Used in This Book

To help distinguish between different kinds of text, we've used a few typographic conventions. Italic type is used for important words or phrases used for the first time, such as structured programming. Monospace type can denote any of the following:

C++ source code is presented as follows:

#include <iostream>
using namespace std;
int main()
{
      cout << "What's up, Doc!\n";
      return 0;
}

Sample program runs use the same format, except user input appears in boldface:

Please enter your name:
Plato

Because this book is about object-oriented programming, we've used geometric objects along the way to help you identify various elements of the book. Tips, rules, and notes are marked with light bulbs, pointing hands, and pencils.

You'll find an occasional rule or suggestion in the following format:

Tip

graphics/bulb.gif

You learn by doing, so try the examples and experiment with them.

By the way, you've just read a real and important suggestion, not just an example of what a rule or suggestion looks like.

Finally, when you enter program input, you normally have to press the Return key or the Enter key to send the input to the program. Some keyboards use one and some the other; this book uses Enter.

Our System

This book describes the ISO/ANSI C++ Standard (ISO/IEC 14882:1998), so the examples should work with any C++ implementation compatible with that standard. (At least, this is the vision and hope of portability.) However, the C++ standard is still new, and you may find a few discrepancies. For example, at the time of this writing, some C++ compilers lack namespaces or the newest template features. Support for the Standard Template Library described in Chapter 16, "The string Class and the Standard Template Library," is spotty at the time of this writing. Systems that use the Release 2.0 (or later) cfront translator may then pass the translated code to a C compiler that is not fully ANSI-compatible, resulting in some language features being left unimplemented and in some standard ANSI library functions and header files not being supported. Also, some things, such as the number of bytes used to hold an integer, are implementation-dependent.

For the record, the examples in this book were developed using Microsoft Visual C++ 6.0 and Metrowerks CodeWarrior Professional Release 6 on a Pentium PC with a hard disk and running under Windows 98. Most programs were checked using the Borland C++ 5.5 command-line compiler and GNU gpp 2.95 on the same system, using Comeau 4.4.45 and GNU g++ 2.95 on an IBM-compatible Pentium running Linux, and using Metrowerks CodeWarrior Professional Release 6 on a Macintosh G3 under System 8.6. The book reports discrepancies stemming from lagging behind the standard generically, as in "older implementations use ios::fixed instead of ios_base::fixed." The book reports some bugs and idiosyncrasies that would prove troublesome or confusing; however, these may very well be fixed in subsequent releases.

Real World Note: Bjarne Stroustrup's Home Page

graphics/common.gif

Bjarne Stroustrup designed and implemented the C++ programming language and is the author of the definitive reference manuals "The C++ Programming Language" and "The Design and Evolution of C++." His personal Web site at AT&T Labs Research should be the first C++ bookmark, or favorite, you create:

http://www.research.att.com/~bs/

This site includes an interesting historical perspective of the how's and why's of the C++ language, Bjarne's biographical material, and C++ FAQs. Believe it, or not, but Bjarne's most frequently asked question is how to pronounce Bjarne Stroustrup. Download the .WAV file to hear for yourself!

CONTENTS