Suchen und Finden
Contents at a Glance
3
Contents
603
About the Author
619
About the Technical Reviewer
620
Introduction
5
Chapter 1: Basic Ideas
7
Modern C++
7
C++ Program Concepts
8
Comments and Whitespace
8
Preprocessing Directives and Header Files
9
Functions
9
Statements
10
Data Input and Output
11
return Statements
11
Namespaces
11
Names and Keywords
12
Classes and Objects
13
Templates
13
Program Files
13
Standard Libraries
13
Code Presentation Style
13
Creating an Executable
14
Representing Numbers
15
Binary Numbers
15
Hexadecimal Numbers
17
Negative Binary Numbers
18
Octal Values
20
Big-Endian and Little-Endian Systems
20
Floating-Point Numbers
21
Representing Characters
22
ASCII Codes
22
UCS and Unicode
23
C++ Source Characters
23
Trigraph Sequences
24
Escape Sequences
24
Procedural and Object-Oriented Programming
26
Summary
27
Chapter 2: Introducing Fundamental Types of Data
29
Variables, Data, and Data Types
29
Defining Integer Variables
30
Defining Variables with Fixed Values
32
Integer Literals
32
Decimal Integer Literals
32
Hexadecimal Literals
33
Octal Literals
33
Binary Literals
34
Calculations with Integers
34
More on Assignment Operations
36
The op= Assignment Operators
38
using Declarations and Directives
40
The sizeof Operator
40
Incrementing and Decrementing Integers
41
Postfix Increment and Decrement Operations
41
Defining Floating-Point Variables
42
Floating-Point Literals
43
Floating-Point Calculations
44
Mathematical Functions
46
Formatting Stream Output
49
Mixed Expressions and Type Conversion
51
Explicit Type Conversion
53
Old-Style Casts
55
Finding the Limits
55
Working with Character Variables
56
Working with Unicode Characters
57
The auto Keyword
58
Lvalues and Rvalues
58
Summary
59
Chapter 3: Working with Fundamental Data Types
61
Operator Precedence and Associativity
61
Bitwise Operators
63
The Bitwise Shift Operators
64
Shifting Signed Integers
66
Logical Operations on Bit Patterns
66
Using the Bitwise AND
67
Using the Bitwise OR
68
Using the Bitwise Exclusive OR
69
Enumerated Data Types
73
Old-Style Enumerations
76
Synonyms for Data Types
76
The Lifetime of a Variable
77
Positioning Variable Definitions
77
Global Variables
77
Static Variables
81
External Variables
81
Summary
82
Chapter 4: Making Decisions
84
Comparing Data Values
84
Applying the Comparison Operators
85
Comparing Floating Point Values
87
The if Statement
87
Nested if Statements
90
Code-Neutral Character Handling
91
The if-else Statement
93
Nested if-else Statements
94
Understanding Nested ifs
95
Logical Operators
97
Logical AND
97
Logical OR
98
Logical Negation
98
The Conditional Operator
100
The switch Statement
102
Unconditional Branching
105
Statement Blocks and Variable Scope
106
Summary
107
Chapter 5: Arrays and Loops
109
Arrays
109
Using an Array
110
Understanding Loops
111
The for Loop
112
Avoiding Magic Numbers
114
Defining the Array Size with the Initializer List
115
Determining the Size of an Array
115
Controlling a for Loop with Floating-Point Values
117
More Complex for Loop Control Expressions
118
The Comma Operator
120
The Ranged-based for Loop
120
The while Loop
121
Allocating an Array at Runtime
123
The do-while Loop
125
Nested Loops
127
Skipping Loop Iterations
129
Breaking Out of a Loop
131
Indefinite Loops
131
Arrays of Characters
135
Multidimensional Arrays
138
Initializing Multidimensional Arrays
140
Setting Dimensions by Default
141
Multidimensional Character Arrays
142
Alternatives to Using an Array
144
Using array
Containers 144
Using std::vector
Containers 148
The Capacity and Size of a Vector
149
Deleting Elements from a Vector container
151
Summary
152
Chapter 6: Pointers and References
154
What Is a Pointer ?
154
The Address-Of Operator
156
The Indirection Operator
157
Why Use Pointers ?
159
Pointers to Type char
159
Arrays of Pointers
161
Constant Pointers and Pointers to Constants
163
Pointers and Arrays
165
Pointer Arithmetic
165
The Difference between Pointers
167
Using Pointer Notation with an Array Name
167
Dynamic Memory Allocation
170
The Stack and the Heap
170
Using the new and delete Operators
171
Dynamic Allocation of Arrays
172
Member Selection through a Pointer
174
Hazards of Dynamic Memory Allocation
174
Memory Leaks
175
Fragmentation of the Free Store
175
Raw Pointers and Smart Pointers
176
Using unique_ptr
Pointers 177
Using shared_ptr
Pointers 178
Comparing shared_ptr
Objects 181
weak_ptr
Pointers 182
Understanding References
183
Defining lvalue References
184
Using a Reference Variable in a Range-Based for Loop
184
Defining rvalue References
185
Summary
186
Chapter 7: Working with Strings
188
A Better Class of String
188
Defining string Objects
189
Operations with String Objects
191
Concatenating Strings
191
Accessing Characters in a String
193
Accessing Substrings
195
Comparing Strings
196
The compare(?) Function
198
Comparisons Using substr(?)
200
Searching Strings
201
Searching for any of a Set of Characters
203
Searching a String Backwards
206
Modifying a String
207
Inserting a String
207
Replacing a Substring
208
Removing Characters from a String
210
Strings of International Characters
211
Strings of wchar_t Characters
211
Objects that contain Unicode Strings
212
Raw String Literals
212
Summary
213
Chapter 8: Defining Functions
215
Segmenting Your Programs
215
Functions in Classes
216
Characteristics of a Function
216
Defining Functions
216
The Function Body
218
Return Values
219
How the return Statement Works
219
Function Declarations
219
Function Prototypes
220
Passing Arguments to a Function
221
Pass-by-Value
221
Passing a Pointer to a Function
223
Passing an Array to a Function
224
const Pointer Parameters
225
Passing a Multidimensional Array to a Function
226
Pass-by-Reference
227
References Can Be Risky
228
Improving the Program
230
Simplifying Code using Type Aliases
231
References versus Pointers
231
Arguments to main()
232
Default Argument Values
233
Multiple Default Parameter Values
233
Returning Values from a Function
235
Returning a Pointer
235
Returning a Reference
240
Inline Functions
241
Static Variables
241
Function Overloading
243
Overloading and Pointer Parameters
245
Overloading and Reference Parameters
245
Overloading and const Parameters
247
Overloading with const Pointer Parameters
247
Overloading and const Reference Parameters
248
Overloading and Default Argument Values
248
A Sausage Machine for Functions
249
Creating Instances of a Function Template
250
Explicit Template Argument
251
Function Template Specialization
252
Function Templates and Overloading
253
Function Templates with Multiple Parameters
254
Non-Type Template Parameters
255
Trailing Return Types
256
Pointers to Functions
257
Defining Pointers to Functions
258
Recursion
260
Applying Recursion
263
The Quicksort Algorithm
263
The main() Function
264
The extract_words() Function
265
The swap() Function
266
The sort() function
266
The max_word_length() Function
267
The show_words() Function
268
Summary
269
Chapter 9: Lambda Expressions
273
Introducing Lambda Expressions
273
Defining a Lambda Expression
274
Naming a Lambda Expression
274
Passing a Lambda Expression to a Function
276
Function Templates that Accept Lambda Expression Arguments
276
A Function Parameter Type for Lambda Arguments
277
Using the std::function Template Type
278
The Capture Clause
281
Capturing Specific Variables
282
Using Lambda Expressions in a Template
283
Recursion in Lambda Expressions
285
Summary
286
Chapter 10: Program Files and Preprocessing Directives
288
Understanding Translation Units
288
The “One Definition” Rule
289
Program Files and Linkage
289
Determining Linkage for a Name
289
External Names
290
const Variables with External Linkage
290
Preprocessing Your Source Code
290
Defining Preprocessing Identifiers
292
Undefining an Identifier
293
Including Header Files
293
Preventing Duplication of Header File Contents
294
Namespaces
295
The Global Namespace
296
Defining a Namespace
296
Applying using Declarations
299
Functions and Namespaces
299
Unnamed Namespaces
302
Namespace Aliases
302
Nested Namespaces
303
Logical Preprocessing Directives
304
The Logical #if Directive
304
Testing for Specific Identifier Values
304
Multiple Choice Code Selection
305
Standard Preprocessing Macros
306
Debugging Methods
307
Integrated Debuggers
307
Preprocessing Directives in Debugging
308
Using the assert(?) Macro
312
Switching Off assert() Macros
312
Static Assertions
313
Summary
314
Chapter 11: Defining Your Own Data Types
316
Classes and Object-Oriented Programming
316
Encapsulation
317
Data Hiding
318
Inheritance
318
Polymorphism
319
Terminology
320
Defining a Class
321
Constructors
323
Defining Constructors Outside the Class
325
Default Constructor Parameter Values
327
Using a Constructor Initialization List
327
Use of the explicit Keyword
328
Delegating Constructors
330
The Copy Constructor
331
Implementing the Copy Constructor
332
Reference Parameters
332
Accessing Private Class Members
332
Friends
334
The Friend Functions of a Class
334
Friend Classes
337
The this Pointer
337
Returning this from a Function
338
const Objects and const Member Functions
339
Casting Away const
340
Arrays of Class Objects
341
The Size of a Class Object
342
Static Members of a Class
343
Static Data Members
343
Accessing Static Data Members
346
A Static Data Member of the Class Type
347
Static Function Members
347
Destructors
348
Pointers and References to Class Objects
351
Using Pointers As Class Members
351
Defining the Package Class
354
Defining the Truckload Class
355
Implementing the Truckload Class
356
Nested Classes
360
Summary
363
Chapter 12: Operator Overloading
366
Implementing Operators for a Class
366
Operator Overloading
367
Operators That Can Be Overloaded
367
Implementing an Overloaded Operator
368
Global Operator Functions
370
Implementing Full Support for an Operator
371
Implementing All Comparison Operators in a Class
372
Operator Function Idioms
374
Default Class Members
375
Defining the Destructor
376
When to Define a Copy Constructor
378
Implementing the Assignment Operator
378
Implementing Move Operations
380
Overloading the Arithmetic Operators
381
Improving Output Operations
385
Implementing One Operator in Terms of Another
387
Overloading the Subscript Operator
388
Lvalues and the Overloaded Subscript Operator
393
Potential Ambiguities with Conversions
396
Overloading Type Conversions
395
Overloading the Increment and Decrement Operators
396
Function Objects
397
Summary
398
Chapter 13: Inheritance
400
Classes and Object-Oriented Programming
400
Hierarchies
401
Inheritance in Classes
402
Inheritance vs. Aggregation
402
Deriving Classes
403
protected Members of a Class
406
The Access Level of Inherited Class Members
406
Choosing Access Specifiers in Class Hierarchies
408
Changing the Access Specification of Inherited Members
409
Constructor Operation in a Derived Class
410
The Copy Constructor in a Derived Class
413
The Default Constructor in a Derived Class
415
Inheriting Constructors
416
Destructors Under Inheritance
417
The Order in Which Destructors Are Called
418
Duplicate Data Member Names
419
Duplicate Function Member Names
420
Multiple Inheritance
420
Multiple Base Classes
421
Inherited Member Ambiguity
422
Repeated Inheritance
425
Virtual Base Classes
426
Converting Between Related Class Types
427
Summary
427
Chapter 14: Polymorphism
429
Understanding Polymorphism
429
Using a Base Class Pointer
429
Calling Inherited Functions
431
Virtual Functions
434
Requirements for Virtual Function Operation
438
Virtual Functions and Class Hierarchies
438
Using override
440
Using final
440
Access Specifiers and Virtual Functions
441
Default Argument Values in Virtual Functions
442
Virtual Function Calls with Smart Pointers
444
Using References to Call Virtual Functions
444
Calling the Base Class Version of a Virtual Function
445
Converting Between Pointers to Class Objects
446
Dynamic Casts
448
Casting Pointers Dynamically
448
Converting References
450
Determining the Polymorphic Type
450
The Cost of Polymorphism
451
Pure Virtual Functions
452
Abstract Classes
453
Abstract Classes As Interfaces
455
Indirect Abstract Base Classes
456
Destroying Objects Through a Pointer
458
Virtual Destructors
460
Summary
460
Chapter 15: Runtime Errors and Exceptions
462
Handling Errors
462
Understanding Exceptions
463
Throwing an Exception
464
The Exception Handling Process
466
Unhandled Exceptions
467
Code That Causes an Exception to Be Thrown
468
Nested try Blocks
470
How It Works
472
Class Objects as Exceptions
473
Matching a Catch Handler to an Exception
474
How It Works
476
Catching Derived Class Exceptions with a Base Class Handler
477
Rethrowing Exceptions
479
Catching All Exceptions
482
Functions That Throw Exceptions
484
Function try Blocks
484
Functions That Don’t Throw Exceptions
485
Constructor try Blocks
485
Exceptions and Destructors
486
Standard Library Exceptions
486
The Exception Class Definitions
488
Using Standard Exceptions
489
Deriving your own Exception Classes
489
Summary
492
Chapter 16: Class Templates
494
Understanding Class Templates
494
Defining Class Templates
495
Template Parameters
496
A Simple Class Template
497
Defining Function Members of a Class Template
499
Constructor Templates
499
The Destructor Template
500
Subscript Operator Templates
501
The Assignment Operator Template
501
Instantiating a Class Template
502
Static Members of a Class Template
507
Non-Type Class Template Parameters
508
Templates for Function Members with Non-Type Parameters
511
Arguments for Non-Type Parameters
515
Pointers and Arrays as Non-Type Parameters
515
Default Values for Template Parameters
516
Explicit Template Instantiation
517
Special Cases
517
Using static_assert(?) in a Class Template
518
Defining a Class Template Specialization
519
Partial Template Specialization
520
Choosing between Multiple Partial Specializations
520
Friends of Class Templates
521
Class Templates with Nested Classes
523
Function Templates for Stack Members
525
Summary
529
Chapter 17: File Input and Output
531
Input and Output in C++
531
Understanding Streams
532
Data Transfer Modes
532
Text Mode Operations
532
Binary Mode Operations
532
Advantages of Using Streams
533
Stream Classes
534
Standard Stream Objects
535
Stream Insertion and Extraction Operations
535
Stream Extraction Operations
536
Stream Insertion Operations
536
Stream Manipulators
537
Manipulators with Arguments
539
File Streams
540
Writing a File in Text Mode
541
Reading a File in Text Mode
543
Checking the State of a File Stream
543
Reading the File
544
Setting the Stream Open Mode
546
Managing the Current Stream Position
551
Unformatted Stream Operations
553
Unformatted Stream Input
554
Unformatted Stream Output
556
Errors in Stream Input/Output
556
Input/Output Errors and Exceptions
558
Stream Operations in Binary Mode
559
Writing Numeric Data in Binary
561
File Read/Write Operations
569
Random Access to a File
570
Random Access to a Binary Stream
570
Random File Operations in Practice
570
Implementing the Constructor
571
Checking for the Existence of a File
572
Finding a Prime that follows a Prime
573
Checking for a Prime
574
Implementing the Subscript Operator
574
Using the Primes Class
575
String Streams
576
Objects and Streams
577
Using the Insertion Operator with Objects
577
Using the Extraction Operator with Objects
578
Object I/O in Binary Mode
580
More Complex Objects in Streams
583
Summary
588
Index
590
Alle Preise verstehen sich inklusive der gesetzlichen MwSt.