C++ Programming Basics - Texas Advanced Computing Center - Home
Transcript of C++ Programming Basics - Texas Advanced Computing Center - Home
![Page 1: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/1.jpg)
C++ Programming Basics
C++ Programming Basics
Andy R. Terrel
The Texas Advanced Computing Center
March 26, 2012
![Page 2: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/2.jpg)
C++ Programming Basics
Outline
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
2
![Page 3: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/3.jpg)
C++ Programming Basics
Introduction
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
3
![Page 4: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/4.jpg)
C++ Programming Basics
Introduction
A few choice quotations
C++ is just an abomination. Everything is wrong with it inevery way.
Jamie ZawinskiNetscape, 1994
C++ is a horrible language. It’s made more horrible by thefact that a lot of substandard programmers use it . . .
Linus TorvaldsCreator of Linux
4
![Page 5: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/5.jpg)
C++ Programming Basics
Introduction
A few choice quotations
. . . by and large I think it’s a bad language. It does a lotof things half well and it’s just a garbage heap of ideasthat are mutually exclusive. Everybody I know, whetherit’s personal or corporate, selects a subset and thesesubsets are different.
Ken ThompsonGoogle
5
![Page 6: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/6.jpg)
C++ Programming Basics
Introduction
A few choice quotations
C makes it easy to shoot yourself in the foot; C++ makesit harder, but when you do it blows your whole leg off.
There are only two kinds of [programming] languages: theones people complain about, and the ones nobody uses.
Bjarne StroustrupCreator of C++
6
![Page 7: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/7.jpg)
C++ Programming Basics
Introduction
Facts about C++
C++ Standardization Timeline
• Began in 1979 at Bell Labs as “C with Classes”
• Renamed C++ in 1983
• Language standard ratified in 1998 as ISO/IEC 14882:1998
• Most recent amendment to the standard in 2003, ISO/IEC14882:2003
• Next standard (formerly known as “C++0x”) is indevelopment, Final Committee Draft approved, possiblestandard finalization as early as 2011
7
![Page 8: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/8.jpg)
C++ Programming Basics
Introduction
Facts about C++
C++ Technical Specifications
• C++ is a “multi-paradigm” language:
– Imperative– Generic (templates)– Object Oriented
• This means that programmers can work in a variety of styles,freely intermixing constructs from different paradigms
• One can also write C++ code in the functional programmingparadigm (think Haskell, Lisp) with templatemetaprogramming
8
![Page 9: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/9.jpg)
C++ Programming Basics
Introduction
Facts about C++
• C++ is often said to be a “superset” of C, but
Superset of C ; Any C code will compile with a C++ compiler
• Simple example: C++ introduces new keywords, so legal Ccode such as:
int class = 0;
int public = 0;
int private = 0;
int new = 0;
will not compile with a C++ compiler.
9
![Page 10: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/10.jpg)
C++ Programming Basics
Introduction
Facts about C++
• Knowledge of C is absolutely not required to beginprogramming in C++
• In fact, extensive C knowledge can be detrimental to learningC++ because:
– You already “know” how to do things in C,– Therefore you are not exposed to the “C++ way” of doing them– Hence, you are still writing C code, but with a slower, more
complicated compiler and worse binary compatibility!
10
![Page 11: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/11.jpg)
C++ Programming Basics
Data Types
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
11
![Page 12: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/12.jpg)
C++ Programming Basics
Data Types
Categories of built-in data types
• There are only a few built-in data type categories in C/C++
– void
– bool
– Integral types– Floating point types
12
![Page 13: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/13.jpg)
C++ Programming Basics
Data Types
void
• void is the anti-datatype
• You cannot declare a variable of type void
void x; // Error!
• Often used as a return “value” for functions which returnnothing
13
![Page 14: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/14.jpg)
C++ Programming Basics
Data Types
bool
• bool variables can only take on one of two values: true orfalse
• In C/C++, any zero- (resp. nonzero-) valued integral type isautomatically convertible to false (resp. true)
• Could be implemented within a single bit, but its size is notspecified by the standard and is usually 1 byte
• Exists primarily because, if it didn’t, everyone would have anequivalent but differently-named boolean type
14
![Page 15: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/15.jpg)
C++ Programming Basics
Data Types
Integral data types
• The integral data types of C/C++ are
– char
– int
• Both have unsigned variations, signed is the default
• int has: short, long, and long long variations
15
![Page 16: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/16.jpg)
C++ Programming Basics
Data Types
char
• The standard guarantees only the size of char
• All other data type sizes are implementation-dependent(though most implementations are consistent)
• sizeof(char)==1 (byte), guaranteed
16
![Page 17: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/17.jpg)
C++ Programming Basics
Data Types
char
• char:
– Can represent integral values ∈ [−128, 127]1
– Seven binary digits and one sign bit
• unsigned char:
– Uses all 8 binary digits– Can represent values ∈ [0, 255]
1All ranges for integral types assume two’s-complement arithmetic. This isvery common, but not actually specified by the C++ standard.http://en.wikipedia.org/wiki/Two’s_complement
17
![Page 18: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/18.jpg)
C++ Programming Basics
Data Types
int
• One may drop the int keyword when referring to the differentint variations, eg.
short i;
long j;
• The size of the different int variations is implementationdefined, but typically
sizeof() max unsigned
short 2 65,535int 4 4,294,967,295long 4/8 (32/64-bit OS)long long 8 18,446,744,073,709,551,615
18
![Page 19: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/19.jpg)
C++ Programming Basics
Data Types
Floating point data types
• The floating point data types of C/C++ are
– float (aka single precision)– double (as in double precision)
• double has a “long” variation
• The standard guarantees only:sizeof(float) <= sizeof(double) <= sizeof(long double)
19
![Page 20: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/20.jpg)
C++ Programming Basics
Data Types
Floating point data types
• Floating point numerical representations are quite complex!
• See: http://en.wikipedia.org/wiki/Floating-point
20
![Page 21: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/21.jpg)
C++ Programming Basics
Data Types
Floating point data types
• When working with floating point numbers, we are primarilyinterested in a quantity called “machine epsilon”
• Machine epsilon is the difference between 1 and the leastvalue greater than 1 that is representable
• C++ makes it easy to obtain the machine epsilon for anyfloating point data type with the numeric limits class
Type sizeof() numeric limits<Type>::epsilon()
float 4 1.19209e−07double 8 2.22045e−16long double 16 1.08420e−19
21
![Page 22: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/22.jpg)
C++ Programming Basics
Control Structures
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
22
![Page 23: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/23.jpg)
C++ Programming Basics
Control Structures
Scope
int y=10;
{
// We can still see y
int x=y;
}
// x is no longer accessible!
• Defined by any pair of “curly” brackets
• Used in functions, loops, or just normal code
22
![Page 24: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/24.jpg)
C++ Programming Basics
Control Structures
Scope
int y=10;
{
// We can still see y
int x=y;
}
// x is no longer accessible!
• Perhaps the most ubiquitous “control structure”
• Because of this, also nearly invisible
22
![Page 25: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/25.jpg)
C++ Programming Basics
Control Structures
Functions
void f(int x, double y)
{
// function body, use x and y
}
f(1, 2.71828);
• Basic syntax is:
rtype fname(args) { stmt; return val; }
– rtype - the type of variable returned by the function– fname - name of the function– args - comma-separated list of arguments
22
![Page 26: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/26.jpg)
C++ Programming Basics
Control Structures
Functions
void f(int x, double y)
{
// function body, use x and y
}
f(1, 2.71828);
• Basic syntax is:
rtype fname(args) { stmt; return val; }
– stmt - code operating on args
– return - C/C++ keyword: return to calling function– val - object of type rtype, returned to calling function
22
![Page 27: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/27.jpg)
C++ Programming Basics
Control Structures
Functions
void f(int x, double y)
{
// function body, use x and y
}
f(1, 2.71828);
• No distinction between “subroutine” and “function”
• Maximum of one return value allowed
• Functions must be declared (aka “prototyped”) before theycan be used
22
![Page 28: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/28.jpg)
C++ Programming Basics
Control Structures
For loop
for (int i=0; i<N; ++i)
{
// Use i here
}
// i is now "out of scope"
• Basic syntax is: for (init; cond; inc)
– init - an expression initializing loop counters– cond - a boolean expression; stops loop execution when false– inc - an expression for updating the loop counter
22
![Page 29: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/29.jpg)
C++ Programming Basics
Control Structures
For loop
for (int i=0; i<N; ++i)
{
// Use i here
}
// i is now "out of scope"
• Same as the standard C for loop
• Loop variables may be initialized “in line”
• Here, ++i and i++ are equivalent to i←i+1. Prefer theformer for non-trivial counters (iterators).
22
![Page 30: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/30.jpg)
C++ Programming Basics
Control Structures
If/Else
if (i > 0)
{ /* code for i > 0 */ }
else if (i < 0)
{ /* code for i < 0 */ }
else
{ /* code for i == 0 */ }
• Basic syntax is:
if (cond) {...} else {...}
– cond - a boolean expression; if true, code execution enters thefirst set of scoping braces, otherwise skips to the next set
23
![Page 31: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/31.jpg)
C++ Programming Basics
Control Structures
Switch (Case) statements
int x=0;
switch (x)
{
case 0:
// ...
break;
case 1:
// ...
break;
default:
// ...
}
• Basic syntax is:
switch (var) {
case val: { stmt; break; }
default: {}
}
– var - a variable of integral (int, char,enum, etc.) type.
– val - A particular value which var cantake. Must be of integral type.
– stmt - Code which should be executed ifvar==val.
23
![Page 32: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/32.jpg)
C++ Programming Basics
Control Structures
Switch (Case) statements
int x=0;
switch (x)
{
case 0:
// ...
break;
case 1:
// ...
break;
default:
// ...
}
• Basic syntax is:
switch (var) {
case val: { stmt; break; }
default: {}
}
– var - a variable of integral (int, char,enum, etc.) type.
– val - A particular value which var cantake. Must be of integral type.
– stmt - Code which should be executed ifvar==val.
• You must remember to break out of eachcase, otherwise control will fall through tothe next case!
23
![Page 33: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/33.jpg)
C++ Programming Basics
Control Structures
Switch (Case) statements
int x=0;
switch (x)
{
case 0:
// ...
break;
case 1:
// ...
break;
default:
// ...
}
• Basic syntax is:
switch (var) {
case val: { stmt; break; }
default: {}
}
– var - a variable of integral (int, char,enum, etc.) type.
– val - A particular value which var cantake. Must be of integral type.
– stmt - Code which should be executed ifvar==val.
• Always provide a default case to handleunexpected input
23
![Page 34: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/34.jpg)
C++ Programming Basics
Control Structures
While loop
while (i > 0)
{ /* loop body */ }
• Basic syntax is:
while (cond) {...}
– cond - a boolean expression; loop execution continues whilecond evaluates to true
• No formal mechanism to update the loop condition
• Something inside the body can make the condition false
• Can also exit with explicit break
24
![Page 35: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/35.jpg)
C++ Programming Basics
Control Structures
Do loop
do
{ /* loop body */ }
while (i > 0);
• Basic syntax is:
do {...} while (cond);
– cond - a boolean expression; loop execution continues whilecond is true, loop body executes at least once
• Don’t forget trailing semi-colon!
25
![Page 36: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/36.jpg)
C++ Programming Basics
Control Structures
Goto
goto next_step;
// code that will
// be skipped...
next_step:
// Execution will
// begin again here
• Basic syntax is:
goto label;
...
label:
– label - An arbitrary labelmarking a line in the sourcewhere code execution will jumpwhen it hits the goto statement.
26
![Page 37: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/37.jpg)
C++ Programming Basics
I/O with Streams
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
27
![Page 38: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/38.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
27
![Page 39: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/39.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• C++ I/O is handled via “stream” objects
• Standard C++ header files no longer have the .h extension
27
![Page 40: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/40.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• Namespaces prevent collisions between variables with thesame name
• The using directive is a shortcut for prepending std::
27
![Page 41: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/41.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• The main program must be named “main” in both C and C++
• C99 and C++ standards require that main return int
27
![Page 42: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/42.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• cout is the “standard out” output stream in C++
• cout is a member of the std:: namespace
• Alternatively, write “std::cout << ...” everywhere
27
![Page 43: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/43.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• The double less-than character “<<” is the stream “insertionoperator”
• It performs a formatted output operation on the stream
27
![Page 44: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/44.jpg)
C++ Programming Basics
I/O with Streams
Hello World program
C Hello World#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C++ Hello World#include <iostream>
using namespace std;
int main()
{
cout << "Hello World\n";
return 0;
}
• A zero return value typically indicates “success”
• Other programs and the OS itself may check the return statusof your code
27
![Page 45: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/45.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• Both versions print: 3.1415926535897931e+00
• Many programmers still prefer printf for its conciseness
27
![Page 46: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/46.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• C format expression is “%[width].[digits][type]”
• Possible values for “type” are: d, e, f, g, and others
27
![Page 47: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/47.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• setprecision(N), N = number of digits after the decimal
• The scientific tag is equivalent to the “e” type in C
27
![Page 48: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/48.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• C format tags are specified in each printf call
• The C++ formatting tags affect subsequent writes as well
27
![Page 49: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/49.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• endl sends a newline character ’\n’ to the stream andflushes the stream’s buffer
27
![Page 50: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/50.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
double pi = 3.1415926535897932384626433832795029;
C Example
#include <stdio.h>
...
printf("%.16e\n", pi);
C++ Example
#include <iostream>
#include <iomanip>
using namespace std;
...
cout << setprecision(16)
<< scientific
<< pi << endl;
• setprecision is defined in the <iomanip> header
27
![Page 51: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/51.jpg)
C++ Programming Basics
I/O with Streams
Formatted Write
• One advantage of the C++ technique: Setting the format andcreating the output can be effectively decoupled
• One can perform the same operations using “memberfunction” syntax as well
#include <iostream>
using namespace std;
...
double pi = 3.1415926535897932384626433832795029;
cout.precision(16);
cout.setf(ios::scientific);
cout << pi << endl;
28
![Page 52: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/52.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• Both versions print: 867-5309
28
![Page 53: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/53.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• In C, you must declare a separate buffer to hold the string
• There must be enough space in the buffer to hold any stringwhich could be stored there
28
![Page 54: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/54.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• In C++, ostringstream is a stream whose output is a string
• It is defined in the standard <sstream> header
28
![Page 55: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/55.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• The sprintf function is a member of the printf family.
• Its first argument is the character buffer where the string is tobe written
28
![Page 56: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/56.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• ostringstream uses stream insertion just like other streams
• Formatting of the types can be automatic or controlled withthe stream formatting tags discussed previously
28
![Page 57: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/57.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• The str() member function returns a copy of the outputstring that was created by stream insertion
28
![Page 58: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/58.jpg)
C++ Programming Basics
I/O with Streams
Printing to Strings
C Example
#include <stdio.h>
...
char buffer[16];
int i=867, j=5309;
sprintf(buffer,
"%d-%d", i, j);
printf("%s\n", buffer);
C++ Example
#include <iostream>
#include <sstream>
using namespace std;
...
ostringstream s;
int i=867, j=5309;
s << i << ’-’ << j;
cout << s.str() << endl;
• The primary benefit of the C++ version is that memory ismanaged automatically
28
![Page 59: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/59.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
28
![Page 60: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/60.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
• C++ file “streams” are defined in the “<fstream>” header
28
![Page 61: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/61.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
• In C, a FILE* pointer is used to interface with files
• We must also specify the access mode “w”, for writing
28
![Page 62: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/62.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
• In C++, resource acquisition is initialization: construction ofthe ofstream object coincides with opening the file
• The type of access is automatically determined
28
![Page 63: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/63.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
• In C, a different function with a different signature is requiredto write to file (fprintf vs. printf)
• In C++, the same stream insertion operator is reused
28
![Page 64: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/64.jpg)
C++ Programming Basics
I/O with Streams
Writing to File
Write to file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","w");
fprintf(fptr,
"Hello World\n");
fclose(fptr);
Write to file in C++
#include <fstream>
using namespace std;
...
ofstream file("file.txt");
file << "Hello World\n";
• In C, you must remember to close the file, otherwise theresource will be “leaked”
• In C++, the file is closed automatically when the object goesout of scope
28
![Page 65: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/65.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• Assuming we now read the same file back in . . .
28
![Page 66: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/66.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• In C, mode "r" is used to specify file read access
• The ifstream object opens files for reading automatically
28
![Page 67: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/67.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• fgets reads a single line (up to 32 characters, here) from file
• The newline character (’\n’) is retained in buf
28
![Page 68: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/68.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• In C++, the string object is used to interact with characterstrings
28
![Page 69: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/69.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• The getline function reads an entire line from a stream
• Memory for storing for the string is handled internally
28
![Page 70: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/70.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• The newline character is extracted from the stream anddiscarded
28
![Page 71: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/71.jpg)
C++ Programming Basics
I/O with Streams
Reading from File
Read from file in C#include <stdio.h>
...
FILE *fptr =
fopen("file.txt","r");
char buf[32];
fgets(buf, 32, fptr);
printf("Read: %s", buf);
fclose(fptr);
Read from file in C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
...
ifstream file("file.txt");
string s;
getline(file, s);
cout << "Read: "
<< s << endl;
• Both codes print “Read: Hello World”
28
![Page 72: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/72.jpg)
C++ Programming Basics
I/O with Streams
Processing stdin
C Example
#include <stdio.h>
...
int n;
printf("Enter any integer:\n");
scanf("%d", &n);
...
C++ Example
#include <iostream>
using namespace std;
...
int n;
cout << "Enter any
integer:\n";
cin >> n;
...
• Processing user input from stdin is not common, but it’sworth knowing how to do
28
![Page 73: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/73.jpg)
C++ Programming Basics
I/O with Streams
Processing stdin
C Example
#include <stdio.h>
...
int n;
printf("Enter any integer:\n");
scanf("%d", &n);
...
C++ Example
#include <iostream>
using namespace std;
...
int n;
cout << "Enter any
integer:\n";
cin >> n;
...
• The scanf function will pause to wait for user input
• In C++, the “extraction operator” >> is used to getinformation out of the standard input stream, cin.
28
![Page 74: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/74.jpg)
C++ Programming Basics
I/O with Streams
Exercises
1. Write a simple program, e.g. “Hello World”, compile it, run it,and verify the output on your system.
2. Enhance your simple program by adding a function,e.g. hello world(), defined before main(). Call thisfunction from main(). Bonus: create your function in aseparate text file from main(), and learn how to compile andlink programs with multiple object files.
3. Add a second function, say goodbye world(), to your sampleprogram. Read input from the user, and depending on thatinput, call one of the functions you’ve defined.
29
![Page 75: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/75.jpg)
C++ Programming Basics
I/O with Streams
Exercises
4. Write a code which prints out a “table” of floating pointvalues. Format the output so there are 5 space-separatednumbers per line, and the numbers are in “fixed” format witha width of 8 digits.
Hint: you may want to generate random data to print, see ’manrandom’ for details of the pseudo-random number generatoravailable in C/C++.
double rv =
static_cast<double>(random()) /
static_cast<double>(RAND_MAX);
30
![Page 76: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/76.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
31
![Page 77: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/77.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Pointers have been around since the beginning of C:
– Refer to another value stored in memory using its address– To retrieve the referred-to value is to “dereference the pointer”– May take special value “NULL” meaning “points to nothing”
int i = 5;
int *p = &i;
int *n = NULL;
cout << i << endl;
cout << p << endl;
cout << *p << endl;
cout << n << endl;
Prints:
5
0xbfffee18
5
0
32
![Page 78: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/78.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Pointers are absolutely essential in C and C++ because bothlanguages use “pass by value” semantics
void increment(int x)
{ x = x + 1; }
int main()
{
int i = 99;
increment(i);
cout << i << endl;
return 0;
}
What do you think will beprinted?
32
![Page 79: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/79.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Pointers are absolutely essential in C and C++ because bothlanguages use “pass by value” semantics
void increment(int x)
{ x = x + 1; }
int main()
{
int i = 99;
increment(i);
cout << i << endl;
return 0;
}
What do you think will beprinted?
If you guessed 99, you arecorrect!
32
![Page 80: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/80.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Pointers are absolutely essential in C and C++ because bothlanguages use “pass by value” semantics
void increment(int x)
{ x = x + 1; }
int main()
{
int i = 99;
increment(i);
cout << i << endl;
return 0;
}
What do you think will beprinted?
If you guessed 99, you arecorrect!
A copy of i is passed tothe increment function,any changes made withinthe function body are notpropagated to the callingfunction.
32
![Page 81: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/81.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Passing a pointer, on the other hand, allows the original to bemodified: the copy still refers to the original location inmemory.
void increment(int *x)
{ *x = *x + 1; }
int main()
{
int i = 99;
increment(&i);
cout << i << endl;
return 0;
}
This time, it will print 100.
33
![Page 82: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/82.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointers
• Even more important: “pass by value” implies a copy, and thiscopy could be very expensive depending on the data type!
Right Way
void f(BigData* x)
{ ... }
int main()
{
BigData big;
f(&big);
return 0;
}
Wrong Way!
void f(BigData x)
{ ... }
int main()
{
BigData big;
f(big);
return 0;
}
34
![Page 83: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/83.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
In addition to (and to complement) pointers, C++ providesreferences:
• A reference is an alternative name for an object
• References cannot be NULL – they always refer to something
• References cannot be “reseated,” that is, assigned to refer toa different object, after they have been created
35
![Page 84: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/84.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
• C pointer syntax was “recycled” to implement references
• This causes a great deal of confusion to new users
int i = 5;
int &r = i;
cout << i << endl;
cout << r << endl;
cout << &i << endl;
cout << &r << endl;
Prints:
5
5
0xbfffee0c
0xbfffee0c
36
![Page 85: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/85.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
• What is the deal with allthese & and * characters?
• It depends on the context!
• Use these simple flowchartsto help you remember
left of aaddress of
take the
right of a
?typename
&
Y
reference
type is a
N
Y
?var name
37
![Page 86: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/86.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
• What is the deal with allthese & and * characters?
• It depends on the context!
• Use these simple flowchartsto help you remember
de−
right of a
?typename
Y type is a
N
Y
?var nameleft of a
*
pointer
reference
37
![Page 87: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/87.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
Some Examples:
int *p = &i;“p is of type pointer-to-int, it isequal to the address of i”
int &r = i;“r is of type reference-to-int, itrefers to the integer i”
cout << *i << endl;“dereference i, print thevalue it refers to”
int main(int argc,
char** argv)
“main is a function takingan int called argc, and apointer to a pointer to achar, called argv”
38
![Page 88: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/88.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
References
• With references, we have one more acceptable way to passarguments to functions
Pass by Pointer
void f(BigData* x)
{ x->value = ... }
int main()
{
BigData big;
f(&big);
return 0;
}
Pass by Reference
void f(BigData& x)
{ x.value = ... }
int main()
{
BigData big;
f(big);
return 0;
}
39
![Page 89: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/89.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• Consider the following code:
#include <iostream>
using namespace std;
void f(int* p)
{ cout << *p << endl; }
int main()
{
int array[4] =
{42, -1, 9, 0};
f(array);
return 0;
}
1. Will this code even compile?
2. What is passed to thefunction f?
3. What will the function f
print?
39
![Page 90: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/90.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• Consider the following code:
#include <iostream>
using namespace std;
void f(int* p)
{ cout << *p << endl; }
int main()
{
int array[4] =
{42, -1, 9, 0};
f(array);
return 0;
}
1. Will this code even compile?
2. What is passed to thefunction f?
3. What will the function f
print?
1. Yes!
2. A pointer to the beginningof the array
3. 42, the value at thebeginning of the array
39
![Page 91: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/91.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• Consider the following code:
#include <iostream>
using namespace std;
void f(int* p)
{ cout << *p << endl; }
int main()
{
int array[4] =
{42, -1, 9, 0};
f(array);
return 0;
}
1. Will this code even compile?
2. What is passed to thefunction f?
3. What will the function f
print?
1. Yes!
2. A pointer to the beginningof the array
3. 42, the value at thebeginning of the array
39
![Page 92: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/92.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• Consider the following code:
#include <iostream>
using namespace std;
void f(int* p)
{ cout << *p << endl; }
int main()
{
int array[4] =
{42, -1, 9, 0};
f(array);
return 0;
}
1. Will this code even compile?
2. What is passed to thefunction f?
3. What will the function f
print?
1. Yes!
2. A pointer to the beginningof the array
3. 42, the value at thebeginning of the array
39
![Page 93: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/93.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• The code in the previous example works because arraysautomatically degrade to pointers when passed to functionsexpecting pointers.
• Therefore, you need not worry about accidentally passing anarray by value, and you don’t have to take the address.
• Aside: Arrays can have any name, they need not be calledarray, as in this example!
40
![Page 94: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/94.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Is that an array or a pointer?
• So, arrays and pointers are the same thing then?
• Not exactly, consider:
int a[4] =
{42, -1, 9, 0};
int *p;
p = a; // OK
a = p; // Error!
• A pointer, like “p” above, is a variable, and can be assignedto point anywhere.
• An array name, like “a” above, is not a variable, thus theconverse is an error.
41
![Page 95: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/95.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointer Arithmetic
• Since a pointer can point anywhere, it can also pointsomewhere in the middle of an array
• Moving a pointer is accomplished with simple addition andsubtraction, aka “pointer arithmetic”
int a[4] =
{42, -1, 9, 0};
int *p = a;
cout << *p << endl;
p+=3; // Equivalent to p=p+3;
cout << *p << endl;
Prints:
42
0
42
![Page 96: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/96.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointer Arithmetic
• Array access is handled with the “square brackets” notation
int a[4] =
{42, -1, 9, 0};
cout << a[2] << endl; Prints 9
43
![Page 97: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/97.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointer Arithmetic
• This fact, plus the fact that addition is a commutativeoperation, leads to a notational curiosity:
a[2] == *(a+2) == *(2+a) == 2[a]
int a[4] =
{42, -1, 9, 0};
cout << 2[a] << endl; Prints 9. Really!
• Never write code this way
• Consider it a useful mnemonic device for remembering: “arrayaccess is pointer arithmetic”
44
![Page 98: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/98.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Pointer Arithmetic
• Hopefully by now you are convinced that arrays and pointersare not really the same thing, except that they are, sometimes.
• Now you are almost as confused as all other C/C++
programmers!
45
![Page 99: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/99.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Vectors
• Our simple examples have dealt with fixed-size arrays thus far
• In general, you want to decide at runtime how large an arrayshould be
• The C89 standard did not allow for variable length arrays(VLAs)
• C99 does, and all modern C compilers now support VLAs
46
![Page 100: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/100.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Vectors
• Some drawbacks of arrays:
– Arrays do not generally “know” their own size2
– Arrays, even the VLAs of C99, cannot be resized– C99 does not specify whether VLAs shall be stack or heap
variables
• In a C talk, we would start discussing dynamic memoryallocation, then memory leaks, then debugging . . .
• Luckily for us, we can move straight to std::vector instead!
2If you know the type stored in the array (eg. int), you can always use thesizeof(array)/sizeof(int) calculation to determine the array’s size
47
![Page 101: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/101.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
47
![Page 102: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/102.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• Vector is declared in the standard header, <vector>
47
![Page 103: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/103.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• <int> is a template argument
• Defines the type to be stored in the vector
47
![Page 104: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/104.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• v is the name of the vector
• v is constructed with size 2
• We say: “v is a vector of int”
47
![Page 105: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/105.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• A vector always knows its own size
• Accessible through the size() member function
47
![Page 106: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/106.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• The resize() member function changes the vector’s size
• vector is guaranteed to be contiguous in memory, just like anarray
47
![Page 107: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/107.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• Vector access uses square brackets, just like array
• Unlike array, square brackets are not shorthand for pointerarithmetic
47
![Page 108: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/108.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
The basics: size() and resize()
#include <iostream>
#include <vector>
using namespace std;
...
vector<int> v(2);
cout << v.size() << endl;
v.resize(4);
cout << v.size() << endl;
cout << v[1] << endl;
Prints:
2
4
0
• Entries of the vector are initialized (default constructed)
• All built-in types (int, double, etc.) have default value 0
47
![Page 109: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/109.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
#include <vector>
#include <iostream>
using namespace std;
...
vector<int> v;
v.reserve(100);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
• Efficient use of vector requires minimizing the number ofcalls to resize()
47
![Page 110: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/110.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
#include <vector>
#include <iostream>
using namespace std;
...
vector<int> v;
v.reserve(100);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
• We don’t have to specify a size at construction time
47
![Page 111: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/111.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
#include <vector>
#include <iostream>
using namespace std;
...
vector<int> v;
v.reserve(100);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
• The reserve() member pre-allocates memory
47
![Page 112: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/112.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
#include <vector>
#include <iostream>
using namespace std;
...
vector<int> v;
v.reserve(100);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
• This does not change the size of the vector
47
![Page 113: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/113.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
#include <vector>
#include <iostream>
using namespace std;
...
vector<int> v;
v.reserve(100);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
• The capacity() member function returns the currentmaximum capacity of the vector
47
![Page 114: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/114.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(1123);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
1
100
• Continuing from the previous slide . . .
47
![Page 115: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/115.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(1123);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
1
100
• The push back() member “pushes” entries onto the “back”of the vector
47
![Page 116: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/116.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(1123);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
1
100
• For each entry added with push back(), the size of thevector is increased by 1
47
![Page 117: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/117.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(1123);
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
0
100
1
100
• If the vector has enough capacity, push back() uses existingspace, otherwise it increases the capacity
47
![Page 118: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/118.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v[10] << endl;
v.clear();
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
1
100
?
0
100
• Continuing from the previous slide . . .
47
![Page 119: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/119.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v[10] << endl;
v.clear();
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
1
100
?
0
100
• Attempting to access an entry past the “end” causesundefined behavior (UB), even if there is enough capacity
• UB: anything can happen, the program may even crash
• Don’t do this!
47
![Page 120: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/120.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v[10] << endl;
v.clear();
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
1
100
?
0
100
• The clear() member “erases” all the elements of a vector
• If the elements of the vector are themselves pointers, thepointed-to values are not touched in any way.
• Be careful! This is a very easy way to leak memory!
47
![Page 121: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/121.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v[10] << endl;
v.clear();
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
1
100
?
0
100
• clear() also resets the size of the vector to 0 . . .
47
![Page 122: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/122.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reserving space; size() vs. capacity()
...
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v[10] << endl;
v.clear();
cout << v.size() << endl;
cout << v.capacity() << endl;
Prints:
1
100
?
0
100
• . . . but it does not change the vector’s capacity!
47
![Page 123: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/123.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reducing vector capacity
...
cout << v.size() << endl;
cout << v.capacity() << endl;
vector<int>().swap(v);
cout << v.capacity() << endl;
Prints:
0
100
0
• Reducing vector capacity is not straightforward
• C++ designers wanted to make it hard to accidentallyintroduce poor performance
• Note: memory is automatically reclaimed when a vector goesout of scope
47
![Page 124: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/124.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reducing vector capacity
...
cout << v.size() << endl;
cout << v.capacity() << endl;
vector<int>().swap(v);
cout << v.capacity() << endl;
Prints:
0
100
0
• The trick is to swap your vector with an empty one
• The vector<int>() syntax creates an unnamed temporaryvariable
• The vector’s swap() member function is subsequently called
47
![Page 125: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/125.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reducing vector capacity
...
cout << v.size() << endl;
cout << v.capacity() << endl;
vector<int>().swap(v);
cout << v.capacity() << endl;
Prints:
0
100
0
• The unnamed temporary immediately goes “out of scope”
• vector::swap() is very efficient: only a few pointers have tobe swapped
47
![Page 126: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/126.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Reducing vector capacity
...
cout << v.size() << endl;
cout << v.capacity() << endl;
vector<int>().swap(v);
cout << v.capacity() << endl;
Prints:
0
100
0
• Finally, we are left with the capacity of the defaultconstructed zero-length vector
• The funny syntax is an indication you shouldn’t have to dothis very often
47
![Page 127: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/127.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Using vector with C APIs
C API
void f(int *x, int n)
{
for (int i=0; i<n; ++i)
// modify x[i] ...
}
...
C++ code, calling C API
#include <vector>
using namespace std;
int main()
{
vector<int> v(10);
f(&v[0], v.size());
...
return 0;
}
• vector is designed to work seamlessly with C APIs expectingraw pointers
47
![Page 128: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/128.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Using vector with C APIs
C API
void f(int *x, int n)
{
for (int i=0; i<n; ++i)
// modify x[i] ...
}
...
C++ code, calling C API
#include <vector>
using namespace std;
int main()
{
vector<int> v(10);
f(&v[0], v.size());
...
return 0;
}
• To do so, we pass the address of the first element of thevector
47
![Page 129: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/129.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Using vector with C APIs
C API
void f(int *x, int n)
{
for (int i=0; i<n; ++i)
// modify x[i] ...
}
...
C++ code, calling C API
#include <vector>
using namespace std;
int main()
{
vector<int> v(10);
f(&v[0], v.size());
...
return 0;
}
• Be very careful! If the C API performs dynamic memoryallocation at the pointer, the results are undefined!
47
![Page 130: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/130.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Guidelines for sizing vectors
• If you know the desired size, N, atconstruction time, create yourvector with
• If you know exactly how muchspace is needed at any time afterconstruction...
• If you can estimate how muchspace will be required, reserve thatspace and push back() entries
• If you have no idea how muchspace you’ll need, all you can do ispush back().
vector<type> v(N);
v.resize(N);
v.reserve(N);
v.push back(...);
47
![Page 131: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/131.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Guidelines for sizing vectors
• If you know the desired size, N, atconstruction time, create yourvector with
• If you know exactly how muchspace is needed at any time afterconstruction...
• If you can estimate how muchspace will be required, reserve thatspace and push back() entries
• If you have no idea how muchspace you’ll need, all you can do ispush back().
vector<type> v(N);
v.resize(N);
v.reserve(N);
v.push back(...);
47
![Page 132: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/132.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Guidelines for sizing vectors
• If you know the desired size, N, atconstruction time, create yourvector with
• If you know exactly how muchspace is needed at any time afterconstruction...
• If you can estimate how muchspace will be required, reserve thatspace and push back() entries
• If you have no idea how muchspace you’ll need, all you can do ispush back().
vector<type> v(N);
v.resize(N);
v.reserve(N);
v.push back(...);
47
![Page 133: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/133.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Guidelines for sizing vectors
• If you know the desired size, N, atconstruction time, create yourvector with
• If you know exactly how muchspace is needed at any time afterconstruction...
• If you can estimate how muchspace will be required, reserve thatspace and push back() entries
• If you have no idea how muchspace you’ll need, all you can do ispush back().
vector<type> v(N);
v.resize(N);
v.reserve(N);
v.push back(...);
47
![Page 134: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/134.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Guidelines for sizing vectors
• We covered:
– vector construction, size(), operator[], resize(),reserve(), capacity(), push back(), clear(), andswap()
– Using vector with “C” APIs
• In general: always prefer std::vector over arrays!
• Not covered in detail: the Standard Template Library
– vector is only a single component of the Standard TemplateLibrary (STL)
– Familiarity with the STL is essential to maximizing yourproductivity in C++
48
![Page 135: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/135.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
1. As hinted at previously, the main() function can take twostandard arguments
int main(int argc, char** argv)
{
...
return 0;
}
49
![Page 136: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/136.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
1. As hinted at previously, the main() function can take twostandard arguments
int main(int argc, char** argv)
{
...
return 0;
}
– argc is the number of command line arguments, including theprogram name
– argv is a pointer to an array of “strings” in the form of char*s
49
![Page 137: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/137.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
1. As hinted at previously, the main() function can take twostandard arguments
int main(int argc, char** argv)
{
...
return 0;
}
Write code to print out the command line args, and test yourcode by running it with different numbers and types ofcommand line arguments. Hint: you can access the individualarguments via argv[0], argv[1], . . .
49
![Page 138: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/138.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
2. Write a function which resizes and fills a passed vector withvalues. Back in the main() program, print out the values inthe vector to ensure they are the same values set by thefunction.
50
![Page 139: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/139.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
3. Create a “matrix”-like object using a
vector<vector<double> > matrix;
51
![Page 140: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/140.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
3. Create a “matrix”-like object using a
vector<vector<double> > matrix;
Note that the space between the trailing double greater-thansigns is required to allow the compiler to parse this statementcorrectly.
51
![Page 141: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/141.jpg)
C++ Programming Basics
Pointers, References, Arrays, and Vectors
Exercises
3. Create a “matrix”-like object using a
vector<vector<double> > matrix;
Write code to:
a.) Resize your matrix to hold 100×100 elementsb.) Fill your matrix with valuesc.) Multiply your matrix by a vector or another matrixd.) Compare the “performance” of your matrix operations with
similar operations on a
double array[100][100] da;
51
![Page 142: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/142.jpg)
C++ Programming Basics
Objects
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
52
![Page 143: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/143.jpg)
C++ Programming Basics
Objects
The struct
• The first objects in C were called structs
• Most common use: to combine multiple basic data types intoa single type
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
};
52
![Page 144: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/144.jpg)
C++ Programming Basics
Objects
The struct
• The first objects in C were called structs
• Most common use: to combine multiple basic data types intoa single type
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
};
• Don’t forget semi-colon at end of struct definition!
52
![Page 145: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/145.jpg)
C++ Programming Basics
Objects
The struct
• The first objects in C were called structs
• Most common use: to combine multiple basic data types intoa single type
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
};
• It is generally considered bad practice to put “usingnamespace std;” directives in headers
52
![Page 146: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/146.jpg)
C++ Programming Basics
Objects
The struct
• We can now work with “objects of type Grid” instead of twoseparate vectors, x and y
main.C#include "grid.h"
int main()
{
std::vector<Grid> vg;
...
return 0;
}
52
![Page 147: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/147.jpg)
C++ Programming Basics
Objects
The struct
• Consider how one might use the Grid object:
#include "grid.h"
...
Grid g;
g.x.resize(10);
g.y.resize(10);
...
• This works, but
– The user must know the type and purpose of x and y
– We rely on the user to keep the sizes of x and y synchronized– Code changes over time (what if a z vector were added toGrid?)
52
![Page 148: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/148.jpg)
C++ Programming Basics
Objects
Member functions
• An object-oriented (OO) approach may address thesedifficulties by adding member functions
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
52
![Page 149: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/149.jpg)
C++ Programming Basics
Objects
Member functions
• An object-oriented (OO) approach may address thesedifficulties by adding member functions
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• The “unsigned” type is equivalent to “unsigned int”
52
![Page 150: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/150.jpg)
C++ Programming Basics
Objects
Member functions
• An object-oriented (OO) approach may address thesedifficulties by adding member functions
grid.h
#include <vector>
struct Grid
{
std::vector<double> x, y;
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• Alerts the user that the argument should not be negative
52
![Page 151: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/151.jpg)
C++ Programming Basics
Objects
Member functions
• Grid usage might now look like this:
#include "grid.h"
...
Grid g;
g.resize(10);
...
• An improvement, however:
– A “clever” or misinformed user can still modify x and y directly– Documentation may help some, but compiler-enforced access
control is better
52
![Page 152: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/152.jpg)
C++ Programming Basics
Objects
Public and private keywords
grid.h
#include <vector>
struct Grid
{
private:
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• C++ introducesthe private
and public
keywords toenforce accesscontrol
52
![Page 153: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/153.jpg)
C++ Programming Basics
Objects
Public and private keywords
grid.h
#include <vector>
struct Grid
{
private:
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• Declaring x andy “private”prevents clientsof the objectfrom using themdirectly
52
![Page 154: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/154.jpg)
C++ Programming Basics
Objects
Public and private keywords
grid.h
#include <vector>
struct Grid
{
private:
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• The resize()
interface isdeclared“public”
• Indicates howyou intend theobject to beused
52
![Page 155: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/155.jpg)
C++ Programming Basics
Objects
Public and private keywords
grid.h
#include <vector>
struct Grid
{
private:
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• You can have asmany public
and private
sections asdesired
52
![Page 156: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/156.jpg)
C++ Programming Basics
Objects
Public and private keywords
#include "grid.h"
...
Grid g;
g.x.resize(10); // Error!
...
• This type of usage is now prevented by the compiler
• The error message will be something along the lines: “x isprivate within this context”
52
![Page 157: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/157.jpg)
C++ Programming Basics
Objects
The class
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• Almost all C++
programmersactually use theclass keywordinstead of struct
52
![Page 158: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/158.jpg)
C++ Programming Basics
Objects
The class
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• The maindifference is thatstruct hasdefault publicaccess whileclass has defaultprivate
52
![Page 159: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/159.jpg)
C++ Programming Basics
Objects
The class
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• Some developersreserve the use ofstruct to mean aC-style structhaving no memberfunctions
52
![Page 160: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/160.jpg)
C++ Programming Basics
Objects
The class
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
void resize(unsigned n)
{ x.resize(n); y.resize(n); }
};
• At the very least,use of the class
keyword is a goodway to indicateyour intent to useC++-specificfeatures in theobject
52
![Page 161: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/161.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• C++ provides speciallynamed member functionscalled “constructors” forcreating user-definedobjects
• Constructors do severaluseful things . . .
52
![Page 162: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/162.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
1. Provide a well-definedprocedure for creating anobject
2. Enforce “resourceacquisition isinitialization” (RAII)paradigm
3. Allow efficient objectcreation
4. Require less typing
52
![Page 163: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/163.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• Constructors always havethe same name as theobject itself
52
![Page 164: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/164.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• Constructors can take anargument list
52
![Page 165: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/165.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• If you provide defaultvalues for all constructorarguments, your classcan be“default-constructed”
• That is, code like
Grid g;
vector<Grid> vg(10);
will work.
52
![Page 166: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/166.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• The initialization listbegins with a colonimmediately after theargument list
• It is a comma-separatedlist which calls theconstructors for datamembers of the class
• You must initialize datamembers in the sameorder as they are definedin the class
52
![Page 167: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/167.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• The constructor functionbody may be empty (ashere) or perform furtherinitialization
52
![Page 168: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/168.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• A class may have anynumber of constructors
• When you don’t provideany constructors, thecompiler supplies thedefault constructor foryou automatically
52
![Page 169: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/169.jpg)
C++ Programming Basics
Objects
Constructors
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
Grid(unsigned n=0)
: x(n), y(n) {}
...
};
• Classes with dynamicallyallocated memory shouldalso provide a destructor.
• The destructor also hasthe same name as theclass, preceded by a tilde“∼” character, eg.∼Grid().
52
![Page 170: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/170.jpg)
C++ Programming Basics
Objects
Inheritance
• One of the biggest benefits of the OO programming paradigmis systematic code reuse through inheritance
• Objects related via inheritance are variously called
– “Base”/“Derived”– “Parent”/“Child”– “Superclass”/“Subclass”
pairs
• “Polymorphism” is the property which allows objects of typeDerived* to be referred to via objects of type Base*3
3Likewise for Derived&/Base& pairs.
53
![Page 171: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/171.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
• An example will help tie together inheritance with everythingelse we have learned thus far
• Consider: the standard ofstream, ostringstream, and cout
objects are all derived from a common base class, known asstd::ostream
54
![Page 172: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/172.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
• Inheritance is sometimesexpressed with diagrams
• Unified Modeling Language(UML)
• Arrows point from child toparent
ostream
ostringstream
coutofstream
55
![Page 173: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/173.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
print.h
#include <iostream>
void print(std::ostream& out)
{
out << "Hello World\n";
}
• Inheritance allows us towrite functions whosearguments are pointers orreferences to Base classes
• The print function doesnot know whether theactual stream object is afile, string, or even stdout
55
![Page 174: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/174.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
#include "print.h"
int main()
{
// Print to stdout
print(std::cout);
}
• By passing cout to the printfunction, we can print tostdout
55
![Page 175: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/175.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
#include "print.h"
#include <fstream>
using namespace std;
int main()
{
// Print to file
ofstream file("file.txt");
print(file);
}
• The same functioncan be passed anofstream object, andit will print to file
55
![Page 176: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/176.jpg)
C++ Programming Basics
Objects
Inheritance Example 1
#include "print.h"
#include <sstream>
using namespace std;
int main()
{
// Perform formatted
// write to string
ostringstream s;
print(s);
}
• And finally, the samefunction can also be used toprint to a string stream
• This example is trivial
• Code reuse, enabled throughpolymorphism, is essential tomaintaining an organizedsoftware project!
55
![Page 177: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/177.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
• Consider again the Grid class
• Our initial design had an “unstructured” grid of points in mind
• How can we implement inheritance in this example?
56
![Page 178: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/178.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
(x[0], y[0])(x[2], y[2])
(x[4], y[4])
(x[1], y[1])
(x[6], y[6])
(x[3], y[3])
(x[5], y[5])
• Assume there are n total points
57
![Page 179: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/179.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
(x[0], y[0])(x[2], y[2])
(x[4], y[4])
(x[1], y[1])
(x[6], y[6])
(x[3], y[3])
(x[5], y[5])
• For a given m < n, the coordinates of point m are given by:(x[m], y[m])
57
![Page 180: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/180.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
(x[0], y[0])(x[2], y[2])
(x[4], y[4])
(x[1], y[1])
(x[6], y[6])
(x[3], y[3])
(x[5], y[5])
• The dashed lines suggest a possible connectivity, but we don’tdiscuss connectivity in this example
57
![Page 181: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/181.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
double& x(unsigned m) { return x[m]; }
double& y(unsigned m) { return y[m]; }
unsigned n() { return _x.size(); }
};
• Let’s start by making a few changes to the Grid class
• This will make inheriting from Grid easier
57
![Page 182: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/182.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
double& x(unsigned m) { return x[m]; }
double& y(unsigned m) { return y[m]; }
unsigned n() { return _x.size(); }
};
• It’s common to name private members differently so theyare easier to identify
57
![Page 183: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/183.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
double& x(unsigned m) { return x[m]; }
double& y(unsigned m) { return y[m]; }
unsigned n() { return _x.size(); }
};
• We’ve also added “accessor” functions
• Use to set the values in the x and y vectors
57
![Page 184: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/184.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
double& x(unsigned m) { return x[m]; }
double& y(unsigned m) { return y[m]; }
unsigned n() { return _x.size(); }
};
• One should also check the input value m!
• All input checking is omitted here, to save space
57
![Page 185: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/185.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
std::vector<double> x, y;
public:
double& x(unsigned m) { return x[m]; }
double& y(unsigned m) { return y[m]; }
unsigned n() { return _x.size(); }
};
• We’ve also added a function which can tell us the current sizeof the data vectors
57
![Page 186: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/186.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
#include <utility>
class Grid
{
std::vector<double> x, y;
public:
typedef std::pair<double, double> Point;
Point get point(unsigned m)
{ return Point(_x[m], _y[m]); }
};
• We also define the Point type to simplify interactions withthe class
57
![Page 187: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/187.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
#include <utility>
class Grid
{
std::vector<double> x, y;
public:
typedef std::pair<double, double> Point;
Point get point(unsigned m)
{ return Point(_x[m], _y[m]); }
};
• The syntax for defining a type is:typedef existing type new type;
57
![Page 188: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/188.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
#include <utility>
class Grid
{
std::vector<double> x, y;
public:
typedef std::pair<double, double> Point;
Point get point(unsigned m)
{ return Point(_x[m], _y[m]); }
};
• The pair type is defined in the standard <utility> header
• pair is templated on two (possibly heterogeneous) types
57
![Page 189: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/189.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
#include <utility>
class Grid
{
std::vector<double> x, y;
public:
typedef std::pair<double, double> Point;
Point get point(unsigned m)
{ return Point(_x[m], _y[m]); }
};
• The get point() function returns an object of type Point
• Once again: should check input arguments!
57
![Page 190: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/190.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
• Suppose we need to use a special type of Grid
• The nodes of this special grid shall be formed by a Cartesianproduct of the x and y vectors
• The CartesianGrid will still require 2n storage but willactually represent n2 nodes
58
![Page 191: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/191.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
y[3]
y[0]
x[0] x[1] x[2] x[3]
y[1]
y[2]
• Magenta nodesformed byCartesian productsof the red andblue nodes
• Red and bluenodes are storedin the x and y
vectors of theGrid class
59
![Page 192: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/192.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
15
y[0]
x[0] x[1] x[2] x[3]
y[1]
y[2]
y[3]
0 1 2 3
4 5 6 7
98 10 11
12 13 14• Let there be n
nodes in eachdirection
• Assume wenumber the nodessequentially asshown
• The coordinates ofnode m are givenby:(x[m%n], y[m/n])
60
![Page 193: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/193.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
For reference:
• The modulus operator, m%n == m - n*floor(m/n),
• Integer division, m/n == floor(m/n)
• Where floor(x) ≡ “round to largest integral value notgreater than x”
61
![Page 194: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/194.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• We need to take a few more steps to get the Grid class readyfor subclassing . . .
61
![Page 195: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/195.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• To make the x and y data members accessible to subclasses,we must first declare them protected
61
![Page 196: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/196.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• The protected data members are still not accessible byexternal clients of the class
61
![Page 197: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/197.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• Every class which has subclasses should also have a virtualdestructor
61
![Page 198: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/198.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• The virtual keyword is used to label any function which willbe redefined by subclasses
61
![Page 199: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/199.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h
#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual ~Grid() {}
};
• When applied to destructors, the virtual keyword allowsobjects of type Derived* to be destroyed via objects of typeBase*
61
![Page 200: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/200.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
cartesian grid.h
#include "grid.h"
class CartesianGrid : public Grid
{
public:
CartesianGrid(unsigned n=0)
: Grid(n) {}
};
• We can now define the CartesianGrid class
61
![Page 201: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/201.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
cartesian grid.h
#include "grid.h"
class CartesianGrid : public Grid
{
public:
CartesianGrid(unsigned n=0)
: Grid(n) {}
};
• To declare that one class is derived from another, we followthe name by a colon, the type of inheritance, and the name ofthe parent class
61
![Page 202: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/202.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
cartesian grid.h
#include "grid.h"
class CartesianGrid : public Grid
{
public:
CartesianGrid(unsigned n=0)
: Grid(n) {}
};
• The type of inheritance used here is public, which is thestandard type used in polymorphism
61
![Page 203: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/203.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
cartesian grid.h
#include "grid.h"
class CartesianGrid : public Grid
{
public:
CartesianGrid(unsigned n=0)
: Grid(n) {}
};
• Derived classes also need constructors
• Often, as here, we can simply call the base class constructor
61
![Page 204: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/204.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
• Inheritance implements an“Is a” relationship betweenobjects
• We say “CartesianGrid isa Grid”
Grid
CartesianGrid
"Is a"
62
![Page 205: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/205.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual unsigned n_points()
{ return n(); }
};
cartesian grid.h#include "grid.h"
class CartesianGrid
: public Grid
{
public:
virtual unsigned n_points()
{ return n() * n(); }
};
• One key difference between the two types of Grid is thenumber of actual points they represent
62
![Page 206: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/206.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual unsigned n_points()
{ return n(); }
};
cartesian grid.h#include "grid.h"
class CartesianGrid
: public Grid
{
public:
virtual unsigned n_points()
{ return n() * n(); }
};
• We can characterize this by defining a virtual n points()
function
62
![Page 207: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/207.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual unsigned n_points()
{ return n(); }
};
cartesian grid.h#include "grid.h"
class CartesianGrid
: public Grid
{
public:
virtual unsigned n_points()
{ return n() * n(); }
};
• In the base class, n points() simply returns n(), the size ofthe data vectors x and y
62
![Page 208: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/208.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.h#include <vector>
class Grid
{
protected:
std::vector<double> x, y;
public:
virtual unsigned n_points()
{ return n(); }
};
cartesian grid.h#include "grid.h"
class CartesianGrid
: public Grid
{
public:
virtual unsigned n_points()
{ return n() * n(); }
};
• In the derived class, n points() returns n()*n(), thenumber of points represented in the Cartesian product Grid
62
![Page 209: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/209.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.hclass Grid
{
...
public:
virtual Point
get point(unsigned m)
{
return Point( x[m], y[m]);
}
};
cartesian grid.hclass CartesianGrid
: public Grid
{
public:
virtual Point
get_point(unsigned m)
{
return Point(_x[m % n()],
_y[m / n()]);
}
};
• The manner in which the points are accessed is also differentbetween the two Grids
62
![Page 210: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/210.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.hclass Grid
{
...
public:
virtual Point
get point(unsigned m)
{
return Point( x[m], y[m]);
}
};
cartesian grid.hclass CartesianGrid
: public Grid
{
public:
virtual Point
get_point(unsigned m)
{
return Point(_x[m % n()],
_y[m / n()]);
}
};
• We can characterize this by making get point() virtual inthe base class
62
![Page 211: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/211.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
grid.hclass Grid
{
...
public:
virtual Point
get point(unsigned m)
{
return Point( x[m], y[m]);
}
};
cartesian grid.hclass CartesianGrid
: public Grid
{
public:
virtual Point
get_point(unsigned m)
{
return Point(_x[m % n()],
_y[m / n()]);
}
};
• And then redefining it in the derived class
62
![Page 212: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/212.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• We are now ready to see how inheritance helps enable codereuse
62
![Page 213: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/213.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• We first define the f function which takes a reference to aPoint and computes the scalar function value f (x , y) = xy
62
![Page 214: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/214.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• The const keyword is required so that we can use thisfunction with an unnamed temporary
62
![Page 215: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/215.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• first and second are data members of the std::pair class,here they correspond to x and y values
62
![Page 216: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/216.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• The grid function() takes a reference to a Grid object,hence it can be called with a derived type as well
62
![Page 217: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/217.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
main.C#include "cartesian grid.h"
double f(const Grid::Point& p)
{ return (p.first * p.second); }
void grid function(Grid& g, std::vector<double>& v) {
v.resize(g.n points());
for (unsigned i=0; i<g.n points(); ++i)
v[i] = f(g.get point(i));
}
// Contd. on next slide
• The grid function() uses the virtual n points() andget point() functions
62
![Page 218: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/218.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
// Contd. from previous slide
int main() {
Grid g; // Assume g, cg are somehow
CartesianGrid cg; // filled with values...
std::vector<double> v;
grid_function(g, v);
grid_function(cg, v);
return 0;
}
• Example code calling the grid function()
62
![Page 219: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/219.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
// Contd. from previous slide
int main() {
Grid g; // Assume g, cg are somehow
CartesianGrid cg; // filled with values...
std::vector<double> v;
grid_function(g, v);
grid_function(cg, v);
return 0;
}
• The same function can be called on either type of grid tocompute grid function values at the nodes
62
![Page 220: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/220.jpg)
C++ Programming Basics
Objects
Inheritance Example 2
// Contd. from previous slide
int main() {
Grid g; // Assume g, cg are somehow
CartesianGrid cg; // filled with values...
std::vector<double> v;
grid_function(g, v);
grid_function(cg, v);
return 0;
}
• grid function() need not be rewritten if a new type ofGrid (supporting the same interface) is developed
62
![Page 221: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/221.jpg)
C++ Programming Basics
Objects
Exercises
1. Recall the previous matrix example which utilized a
vector<vector<double> > matrix;
Write code to define a Matrix class. This code should makeseveral of the operations you coded in the previous exerciseeasier to use and reuse.
2. As the designer of the Matrix class, treat other codes (evenyour own) which might use the Matrix as “clients”. Whatinterfaces would clients of a Matrix class expect to have?
63
![Page 222: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/222.jpg)
C++ Programming Basics
Objects
Exercises
3. “Polymorphic collections” of objects are possible throughvectors of pointer-to-Base, or vector<Base*>.
a.) Write code to implement a hierarchy of 2D geometric shapesincluding Circle, Square, Trapezoid, etc., with a commonbase, Shape.
b.) Define a virtual area() function which can be suitablyoverloaded in subclasses.
c.) Create a collection of shapes, for example,
Circle c(0.5); Square s(1.0);
vector<Shape*> vs(2);
vs[0] = &c; vs[1] = &s;
and write code to loop over the collection, computing the areaof each Shape.
64
![Page 223: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/223.jpg)
C++ Programming Basics
Objects
Exercises
4. Think about your personal application/research code at a highlevel, in terms of the key data structures and algorithms, andthe way they interact with one another. Imagine a minimal,coarse-grained set of objects and interfaces which canencapsulate this interaction, possibly sketching a diagramshowing the interrelationships.
65
![Page 224: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/224.jpg)
C++ Programming Basics
C++ in Scientific Software
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
66
![Page 225: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/225.jpg)
C++ Programming Basics
C++ in Scientific Software
• Wait, this is supposed to be “Scientific Software.” Isn’t OOcode ‘slow’?
• But, this is like asking if driving a car is ‘dangerous’.
• It is dangerous, but it is also a very convenient and effectivemeans of transportation.
• As long as everyone plays by the rules, nobody gets hurt!
67
![Page 226: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/226.jpg)
C++ Programming Basics
C++ in Scientific Software
• Wait, this is supposed to be “Scientific Software.” Isn’t OOcode ‘slow’?
Yes!
• But, this is like asking if driving a car is ‘dangerous’.
• It is dangerous, but it is also a very convenient and effectivemeans of transportation.
• As long as everyone plays by the rules, nobody gets hurt!
67
![Page 227: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/227.jpg)
C++ Programming Basics
C++ in Scientific Software
• Wait, this is supposed to be “Scientific Software.” Isn’t OOcode ‘slow’?
Yes!
• But, this is like asking if driving a car is ‘dangerous’.
• It is dangerous, but it is also a very convenient and effectivemeans of transportation.
• As long as everyone plays by the rules, nobody gets hurt!
67
![Page 228: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/228.jpg)
C++ Programming Basics
C++ in Scientific Software
• Wait, this is supposed to be “Scientific Software.” Isn’t OOcode ‘slow’?
Yes!
• But, this is like asking if driving a car is ‘dangerous’.
• It is dangerous, but it is also a very convenient and effectivemeans of transportation.
• As long as everyone plays by the rules, nobody gets hurt!
67
![Page 229: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/229.jpg)
C++ Programming Basics
C++ in Scientific Software
• Wait, this is supposed to be “Scientific Software.” Isn’t OOcode ‘slow’?
Yes!
• But, this is like asking if driving a car is ‘dangerous’.
• It is dangerous, but it is also a very convenient and effectivemeans of transportation.
• As long as everyone plays by the rules, nobody gets hurt!
67
![Page 230: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/230.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• Consider a simple example using a vector to implementrow-major storage.
#include <vector>
...
int matrix_size = 10000;
std::vector<double> v(matrix_size*matrix_size);
int cnt=0;
for (int i=0; i<matrix_size; ++i)
for (int j=0; j<matrix_size; ++j)
v[i*matrix_size+j] = cnt++;
67
![Page 231: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/231.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• Consider a simple example using a vector to implementrow-major storage.
#include <vector>
...
int matrix_size = 10000;
std::vector<double> v(matrix_size*matrix_size);
int cnt=0;
for (int i=0; i<matrix_size; ++i)
for (int j=0; j<matrix_size; ++j)
v[i*matrix_size+j] = cnt++;
67
![Page 232: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/232.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• We can instead hide the index calculation in a user-definedMatrix type:
matrix.h#include <vector>
class Matrix
{
public:
Matrix(int mm, int nn);
double& operator()(int i, int j);
private:
int m, n;
std::vector<double> vals;
};
67
![Page 233: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/233.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• The user code is now:
#include "matrix.h"
...
int matrix_size = 10000;
Matrix m(matrix_size, matrix_size);
int cnt=0;
for (int i=0; i<matrix_size; ++i)
for (int j=0; j<matrix_size; ++j)
m(i,j) = cnt++;
67
![Page 234: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/234.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• Timing results (in seconds, averaged over 5 runs) for the twodifferent versions with different optimization levels.
–O0 –O3
std::vector 5.44 1.72Matrix 6.10 1.70
68
![Page 235: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/235.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 1: Raw vector vs. object
• With a decent compiler (in this case, g++) there is almost nodifference in performance between the two.
• Does not require much advanced optimization knowledge onthe part of the user (e.g. expression templates).
• The “object” code is arguably cleaner, and provides betterreuse possibilities.
69
![Page 236: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/236.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Virtual functions: an OO feature frequently cited as “slow.”
• Modify previous Matrix class to allow subclassing:
class MatrixBase
{
public:
MatrixBase(int mm, int nn);
virtual ~MatrixBase() {}
virtual double& operator()(int i, int j) = 0;
protected:
int m, n;
std::vector<double> vals;
};
69
![Page 237: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/237.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Define the MatrixRowMajor subclass to implement row-majorstorage:
class MatrixRowMajor : public MatrixBase
{
public:
MatrixRowMajor(int mm, int nn);
virtual double& operator()(int i, int j);
};
double& MatrixRowMajor::operator()(int i, int j)
{
return vals[i*n + j]; // row major
}
69
![Page 238: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/238.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Define the MatrixColMajor subclass for column-major storage:
class MatrixColMajor : public MatrixBase
{
public:
MatrixColMajor(int mm, int nn);
virtual double& operator()(int i, int j);
};
double& MatrixColMajor::operator()(int i, int j)
{
return vals[i + m*j]; // col major
}
69
![Page 239: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/239.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• (Essentially) the same matrix-fill code can be re-used...
MatrixRowMajor m(matrix_size, matrix_size);
int cnt=0;
for (int i=0; i<matrix_size; ++i)
for (int j=0; j<matrix_size; ++j)
m(i,j) = cnt++;
69
![Page 240: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/240.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Average timing results (in seconds) for the original andpolymorphic Matrix classes.
–O0 –O3
Matrix 6.10 1.70Matrix (virtual, row-major) 6.08 1.98Matrix (virtual, col-major) 8.06 3.77
70
![Page 241: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/241.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• The additional flexibility obtained by decoupling the storagelayout from the algorithm cost us about 15% in the row-majorcase.
• Also, the “generic” algorithm (which is inherently row-major)did not perform nearly as well on the column-major layout.
• We can address both these issues by becoming virtual at a“higher level.”
71
![Page 242: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/242.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Recognizing that the algorithm is not efficiently decoupledfrom the storage layout, we can make the algorithm itselfvirtual instead.
class MatrixBase
{
public:
MatrixBase(int mm, int nn);
virtual ~MatrixBase() {}
virtual void fill() = 0;
protected:
int m, n;
std::vector<double> vals;
};
71
![Page 243: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/243.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Implemented for the row-major case (col-major case isanalogous):
void MatrixRowMajor::fill()
{
int cnt=0;
for (int i=0; i<m; ++i)
for (int j=0; j<n; ++j)
vals[i*n + j] = cnt++;
}
71
![Page 244: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/244.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• And finally, called generically from user code:
MatrixRowMajor m(matrix_size, matrix_size);
m.fill();
// Or...
MatrixColMajor m(matrix_size, matrix_size);
m.fill();
71
![Page 245: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/245.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Combined results for the original, non-virtual objects and thevirtual fill() function.
–O0 –O3
std::vector 5.44 1.72Matrix 6.10 1.70fill(), row-major 5.70 1.68fill(), col-major 5.71 1.69
72
![Page 246: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/246.jpg)
C++ Programming Basics
C++ in Scientific Software
Example 2: Virtual functions
• Proper use of virtual functions (i.e. not too many) leads tomore flexible code with the same performance as less flexiblecode.
• The fill() method in this example can be made moresophisticated if we also pass a “Filler” function object to it.
• This example was trivial: there are libraries(boost/blitz/eigen) which are much more realistic.
• The guidelines developed here for using virtual functionsshould apply in other situations as well.
73
![Page 247: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/247.jpg)
C++ Programming Basics
C++ in Scientific Software
Exercises
1. Flesh out the example in this section by writing an actualcode using the snippets here for guidance. Compare/verify thereported timings for the different cases on your system.
74
![Page 248: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/248.jpg)
C++ Programming Basics
C++ in Scientific Software
Exercises
2. Extend the example from this section by adding the pure virtualfunction
virtual void matvec(vector<double>& x,
vector<double>& b) = 0;
to the MatrixBase class, which computes the matrix-vectorproduct Ax = b.
a.) Add specializations for row- and column-major subclassesb.) Compare timings for your specialization with hand-coded loops
using vector<double>
74
![Page 249: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/249.jpg)
C++ Programming Basics
C++ in Scientific Software
Exercises
3. Operator overloading is a feature of C++ which provides“syntatic sugar”, that is, makes code look prettier.
a.) Fill in the body of the following free function which overloads the‘*’ operator. Hint: reuse the matvec() function from theprevious exercise!
vector<double> operator*(MatrixBase& A,
vector<double>& x);
b.) Demonstrate the use of your function by writing code like
b = A*x;
for suitably-defined b, A, and x.
74
![Page 250: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/250.jpg)
C++ Programming Basics
Additional References
• Introduction
• Data Types
• Control Structures
• I/O with Streams
• Pointers, References, Arrays, and Vectors
• Objects
• C++ in Scientific Software
• Additional References
75
![Page 251: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/251.jpg)
C++ Programming Basics
Additional References
Reference Websites
• IOStreams and General Referencehttp://www.cplusplus.com
• STL referencehttp://www.sgi.com/tech/stl/table_of_contents.html
• Frequently Asked Questions (Esoteric)http://www.parashift.com/c++-faq-lite
• C++ Newsgroup (“language lawyers”)groups.google.com/group/comp.lang.c++.moderated
76
![Page 252: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/252.jpg)
C++ Programming Basics
Additional References
Books
• “Thinking in C++,” Vols. 1 and 2 by Bruce Eckels(google: “thinking in c++ pdf”)
• All of the “Effective ...” books by Scott Meyers:
– Effective C++
– Effective STL– More Effective C++
77
![Page 253: C++ Programming Basics - Texas Advanced Computing Center - Home](https://reader035.fdocuments.in/reader035/viewer/2022071602/613d5769736caf36b75c2f5d/html5/thumbnails/253.jpg)
C++ Programming Basics
Additional References
Websites of the Cognoscenti
• Herb Sutter, http://herbsutter.com/
• Dave Abrahams, http://daveabrahams.com/
• Andrei Alexandrescu, http://erdani.com/
• Pete Becker, http://www.petebecker.com/
• Jaakko Jarvi, http://parasol.tamu.edu/~jarvi/
• Nicolai Josuttis, http://www.josuttis.com/
• Peter Dimov, http://www.pdimov.com/
• Doug Gregor, http://www.osl.iu.edu/~dgregor/
78