From 351e48f0b0cc2adfe9a46c9fa9b16cd4143d68fc Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:05:56 -0500 Subject: [PATCH 1/9] Add C++ lessons --- cpp-review/basics/lesson.md | 598 ++++++++++++++++++++++++++++++ cpp-review/memory/image.png | Bin 0 -> 8071 bytes cpp-review/memory/images-ppt.pptx | Bin 0 -> 33638 bytes cpp-review/memory/lesson.md | 317 ++++++++++++++++ 4 files changed, 915 insertions(+) create mode 100644 cpp-review/basics/lesson.md create mode 100644 cpp-review/memory/image.png create mode 100644 cpp-review/memory/images-ppt.pptx create mode 100644 cpp-review/memory/lesson.md diff --git a/cpp-review/basics/lesson.md b/cpp-review/basics/lesson.md new file mode 100644 index 0000000..afcb4c8 --- /dev/null +++ b/cpp-review/basics/lesson.md @@ -0,0 +1,598 @@ +# C++ Basics + +**Author:** *Brian Magnuson* + +In the next few lessons, I'll be covering almost everything you need to know about the C++ programming language. C++ is a statically-typed, compiled, general-purpose programming language. Its low-level memory manipulation capabilities and Standard Template Library (STL) make it an ideal language for learning data structures and algorithms. + +These lessons are meant to be a *review* of C++. I'll assume you have some experience with an object-oriented programming language like Java or Python. If you're new to programming, I recommend looking for more beginner-friendly resources on C++. + +If you are ***already familiar with C++***, I would still recommend reading through these lessons as they may contain some useful information for success in this course. + +In this lesson, we will cover: +- The main function +- Preprocessor directives +- Data types +- Variables +- Control structures +- Functions +- Function declarations and header files +- Standard input/output +- Using keyword + +In addition to the above, I will also touch on best C++ practices to help you write well-structured code. + +Notably, I have chosen to omit arrays from this lesson. This and memory management will be covered in the next lesson. + +Let's get started! + +# The Main Function + +If you're building an executable, you will need a main function. Execution begins and ends in the main function. The main function is defined in a file, typically named `main.cpp`. Note that some style guides may recommend using `.cc` or `.cxx` as the file extension for C++ source files. + +**For this course, we use `.cpp` for source files and `.h` for header files.** + +A main function looks like this: +```cpp +int main() { + // Your code here + return 0; +} +``` + +The main function returns an integer. A return value of `0` indicates that the program executed successfully. Any other value indicates an error. You can also use `std::exit` from the `` header to exit from anywhere in the program. + +A main function can also look like this: +```cpp +int main(int argc, char* argv[]) { + // Your code here + return 0; +} +``` + +You may write a main function like this if you want to accept command-line arguments. `argc` is the number of arguments passed to the program, and `argv` is an array of strings containing the arguments. When there are command-line arguments, the string that invoked the program is stored in `argv[0]`, and the arguments are stored in `argv[1]`, `argv[2]`, and so on. + +# Preprocessor Directives + +C++ programs are built in three stages: preprocessing, compiling, and linking. Preprocessing is the first stage. The preprocessor reads the source code and processes preprocessor directives, which start with a `#` symbol. This is all done *before* compilation. + +The `#define` directive creates a macro. During preprocessing, all instances of the macro are replaced with the value or expression. Macros are used to define constants or to create simple functions. +```cpp +#define MACRO_NAME_1 value +#define MACRO_NAME_2(VALUE) VALUE + 1 +``` + +Macros are often written in `UPPER_SNAKE_CASE` to distinguish them from variables. + +You can also define a macro without a value. This is often used to create a *flag* for conditional compilation. +```cpp +#define FLAG +``` + +The `#include` directive is used to include files. During preprocessing, the contents of the file are copied and pasted where the directive is located. +```cpp +#include +#include "my_header.h" +``` + +Using quotes tells the preprocessor to check files relative to the current file, then check the system directories. Using angle brackets tells the preprocessor to check the system directories only. Typically, you will use quotes for your own header files and angle brackets for system header files. + +The `#ifdef`, `#ifndef`, `#else`, and `#endif` directives are used for conditional compilation. These directives are used to include or exclude code based on whether a macro is defined. +```cpp +#ifdef FLAG + // Code here +#else + // Code here +#endif +``` + +These are often useful when you want to compile code for a specific platform or when you want to include debugging code that you can easily turn off. + +The `#ifndef` directive is particularly useful for creating an **include guard**. An include guard prevents files from being compiled more than once (which can cause "multiple definition" errors). All header files should have an include guard as they are often included in multiple files. +```cpp +// my_header.h +#ifndef MY_HEADER_H +#define MY_HEADER_H + +// Header code here + +#endif +``` + +You can choose any name for the macro, but it should be unique to the file. Google's style guide recommends the format `___H_`. For smaller projects, simply naming the macro after the file is sufficient (as shown above). + +These are most of the directives you will encounter in C++. There is, however, one more: the `#pragma` directive. This directive is used to give instructions to the compiler. However, the exact behavior of `#pragma` is compiler-dependent, so it is best to avoid using it. + +One common use of `#pragma` is to act as a simpler include guard. +```cpp +// my_header.h +#pragma once +// No need to use #ifndef MY_HEADER_H + +// Header code here +``` + +GCC, Clang, and MSVC all support the `#pragma once` directive, which tells the compiler to only include the file once. We accept either method in this course (though I have a slight preference for `#ifndef`). + +# Data Types + +C++ has a variety of data types for integers. Confusingly, the size of these data types may vary depending on the platform. + +- `char`: At least 8 bits, but all architectures use 8 bits. + - Values of the `char` data type are printed as characters. 8 bits is enough to represent all ASCII characters. + - Range: -128 to 127 for signed, 0 to 255 for unsigned. + - May be signed or unsigned by default depending on the platform. +- `short` or `short int`: At least 16 bits, but all architectures use 16 bits. + - Range: 16 bits is -32,768 to 32,767 for signed, 0 to 65,535 for unsigned. +- `int`: At least 16 bits, but most architectures use 32 bits. + - Range: 32 bits is -2,147,483,648 to 2,147,483,647 for signed, 0 to 4,294,967,295 for unsigned. +- `long` or `long int`: At least 32 bits. Some architectures use 32 bits. Unix-like systems with a 64-bit architecture use 64 bits. + - Range: 64 bits is -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 for signed, 0 to 18,446,744,073,709,551,615 for unsigned. +- `long long` or `long long int`: At least 64 bits, but all architectures use 64 bits. + +All integer types (except `char`) are signed by default. To make them unsigned, add the `unsigned` keyword. For example, `unsigned int`. + +If you want to guarantee a specific size, the `` header provides fixed-width integer types. However, for this course, using `char`, `int`, and `long long` is usually sufficient. + +For floating-point numbers, C++ has two data types: +- `float`: Single precision, IEEE-754 standard. + - 32 bits. +- `double`: Double precision, IEEE-754 standard. + - 64 bits. + +Numeric literals with a decimal point are treated as `double` by default. To specify a `float`, add an `f` or `F` at the end of the number. E.g., `3.14f`. + +Notably, both IEEE-754 floating point types also support positive infinity, negative infinity, `NaN` (not a number), and negative zero. These can be useful for some calculations. Just be aware that any comparison with `NaN` will always return `false`, including with itself. + +Be careful when comparing floating-point numbers. Due to the way they are stored in memory, floating-point numbers may not be exactly equal. Instead, compare the difference between the two numbers to a small value (often called epsilon). E.g., `fabs(a - b) < 1e-9`. + +Next, there is the `bool` data type. It is almost always 1 byte in size. The values are `true` and `false`. `true` is equivalent to 1, and `false` is equivalent to 0. Note that whenever a boolean value is needed (such as in an `if` statement), any value equivalent to 0 is considered `false`, and any other value is considered `true`. `NaN` is considered `true`. + +Finally, there are pointer types (types with a `*`). We'll cover pointers in the next lesson, but for now, know that pointers are used to store memory addresses. The size of a pointer depends on the architecture. For 32-bit systems, pointers are 4 bytes. For 64-bit systems, pointers are 8 bytes. + +To read more about data types in C++, see [this page](https://en.cppreference.com/w/cpp/language/types). + +# Variables + +Variables can be given any valid identifier. An identifier is a sequence of letters, digits, and underscores that does not start with a digit. Many programmers use `snake_case` or `lowerCamelCase` for variable and function names, though I have a preference for `snake_case`. You can use any style you like, but ***be consistent***. + +A local variable in C++ can be declared like this: +```cpp +int variable_name; +int variable_name = 1; +auto variable_name = 1; +``` + +`auto` is not a data type nor a keyword for a dynamic type (C++ is statically typed). Rather, it tells the compiler to infer the data type from the value assigned to the variable. This is useful when the data type is long (like `std::unordered_map>::iterator`). + +In rare cases, you may want to use `decltype` to use the type of another variable. +```cpp +decltype(variable_name) another_variable_name = 2; +``` + +You can use the `const` keyword to make a variable constant. This means the variable cannot be changed after it is initialized. +```cpp +const int constant_name = 1; +``` + +You can use `constexpr` to make a variable constant at compile time. Some features of C++ such as array sizes require compile-time constants. +```cpp +constexpr int compile_time_constant = 1; +``` + +We recommend against *creating global variables*. Global variables can be accessed from any function, which can make it difficult to track down bugs. If you need to share data between functions, consider using function arguments or returning values. + +To create a reference to a variable, use the `&` symbol. +```cpp +int variable_name = 1; +int& reference_name = variable_name; +reference_name = 2; // also changes variable_name +``` + +References must always be initialized when declared, and the referenced variable cannot be changed. References are often used with range-based `for` loops and function arguments to avoid expensive copies. For other uses, it is best to use references with local variables. + +It is possible to use references in structs and classes, but without guaranteeing the lifetime of the referenced variable, it can potentially lead to undefined behavior, so it is best to avoid this. + +References can be thought of as a special kind of pointer. We will cover pointers and memory management in the next lesson. + +# Control Structures + +These, you probably already know. But let's review them anyway. + +The `if` statement is used to execute code based on a condition. +```cpp +if (condition) { + // Code here +} + +if (condition) { + // Code here +} else if (other_condition) { + // Code here +} else { + // Code here +} +``` + +The `switch` statement is used to execute code based on the value of an expression. +```cpp +switch (expression) { + case value_1: + // Code here + break; + case value_2: + // Code here + break; + default: + // Code here +} +``` +Unlike other languages, the expression in a `switch` statement must be an integer or an enumeration. Floating-point numbers, strings, and other types are not allowed. + +The `while` statement is used to execute code while a condition is true. +```cpp +while (condition) { + // Code here +} +``` + +The `do-while` statement is used to execute code at least once and then while a condition is true. +```cpp +do { + // Code here +} while (condition); +``` + +The `for` statement allows you to initialize a variable, check a condition, and update the variable in one line. It is often used to iterate a specific number of times. +```cpp +for (int i = 0; i < 10; ++i) { + // Code here +} +``` + +I won't be covering most operators in this lesson, but I would like to bring special attention to the `++` and `--` also known as the increment and decrement operators. These operators can be used as a prefix or postfix. The difference is that the prefix operator increments or decrements the variable before the value is used, while the postfix operator increments or decrements the variable after the value is used. For example, `++i` increments `i` and then uses the new value, while `i++` uses the current value of `i` and then increments it. + +The range-based `for` statement is used to iterate over a range of elements. It is often used with arrays, vectors, and other containers. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +for (int i : vec) { + // Code here +} +for (int& i : vec) { + // Code here +} +``` + +You can also use `auto` and `auto&` instead of writing the data type explicitly. + +For all kinds of loops, you can use `break` to exit the loop early and `continue` to skip the rest of the loop and go to the next iteration. + +# Functions + +Here are examples of functions in C++: +```cpp +int add(int a, int b) { + return a + b; +} + +void print_result(int result) { + std::cout << result << std::endl; +} +``` + +The return type is written first, then the function name, then the parameters in parentheses. If the function does not return a value, use `void`. For non-void functions, all code paths should always return a value. + +You can use `...` as the last parameter in a function to create a variadic function. These can be useful at times, but I would recommend against using them for this course. You can read more about variadic functions [here](https://en.cppreference.com/w/cpp/language/variadic_arguments). + +In C++, you can declare multiple functions with the same name but different parameters. This is called **function overloading**. The compiler will choose the correct function based on the parameters passed to it. +```cpp +int add(int a, int b) { + return a + b; +} +double add(double a, double b) { + return a + b; +} +``` + +# Function Declarations and Header Files + +This next part is ***important***, especially for C++ beginners, so pay attention! + +You ***cannot use a function before it is declared***. This is because C++ reads files from top to bottom. If you try to use a function before it is declared, the compiler will throw an error. +```cpp +// In ping_pong.cpp +void ping(int n) { + if (n == 0) return; + pong(n - 1); // Error: pong is not declared +} + +void pong(int n) { + if (n == 0) return; + ping(n - 1); +} +``` + +To fix this, you can declare the function before it is used. This function declaration is called a **prototype**. +```cpp +// In ping_pong.cpp +void pong(int n); + +void ping(int n) { + if (n == 0) return; + pong(n - 1); +} + +void pong(int n) { + if (n == 0) return; + ping(n - 1); +} +``` + +If we want to use the `ping` and `pong` functions in another file, we can create a header file. Header files typically have the `.h` extension. +```cpp +// In ping_pong.h +#ifndef PING_PONG_H +#define PING_PONG_H + +void pong(int n); + +void ping(int n) {...} +void pong(int n) {...} +// Not recommended, but allowed + +#endif +``` + +Although we could include the function definitions in the header file, this can potentially slow down compilation, especially for large projects. For best practices, we should only include the function declarations in the header file and put the function definitions in a source file (typically with a `.cpp` extension). +```cpp +// In ping_pong.h +#ifndef PING_PONG_H +#define PING_PONG_H + +void ping(int n); +void pong(int n); + +#endif +``` +```cpp +// In ping_pong.cpp +#include "ping_pong.h" + +void ping(int n) {...} +void pong(int n) {...} +``` + +This is the ***recommended way*** to structure your C++ code. An exception to this rule is when you are using templates, which we will cover in a later lesson. + +We can then include the header file in the source file where we write the function definitions. +```cpp +// In ping_pong.cpp +#include "ping_pong.h" + +void ping(int n) { + if (n == 0) return; + pong(n - 1); +} + +void pong(int n) { + if (n == 0) return; + ping(n - 1); +} +``` + +Then, if we want to use the `ping` and `pong` functions in another file, we can include the header file. +```cpp +// In main.cpp +#include "ping_pong.h" + +int main() { + ping(10); + return 0; +} +``` + +The main function will be able to use the `ping` and `pong` functions as long as `main.cpp` and `ping_pong.cpp` are compiled and linked together. + +For many C++ project, you'll find that files often come in pairs: a `.cpp` file with the function definitions and a `.h` file with the function declarations. This is a common practice in C++ and is recommended for this course. + +Remember that the C++ preprocessor will check file *relative* to the current file. So if `ping_pong.h` were located in a different directory, say `my_lib`, you would write `#include "my_lib/ping_pong.h"`. You do not need to do this for system header files because the preprocessor checks a specific set of directories where these files are located. You can technically add your own directories to this list using the `-I` flag during compilation, but this is recommended only if you know what you are doing. + +You should ***never*** use `#include` to include a `.cpp` file. This can lead to multiple definitions of functions and variables, which will cause errors. Instead, use header files to declare functions and variables. + +# Standard Input/Output + +C++ uses `std::cin` for input and `std::cout` for output. To use these, you need to include the `` header. +```cpp +#include + +int main() { + int n; + std::cin >> n; + std::cout << n << std::endl; + return 0; +} +``` + +C++ will automatically convert the input to the correct data type. If the input is not a valid number, `std::cin` will set the fail bit, and you can check this with `std::cin.fail()`. You can also use `std::cin.clear()` to clear the fail bit and `std::cin.ignore()` to ignore the invalid input. + +If the input is invalid, `n` will not be assigned. In the example above, it will remain uninitialized, which can lead to undefined behavior. + +Most programming problems in this course use a strict input format (which we specify), so you usually will not need to validate the input. + +`std::endl` is used to insert a newline character and flush the output buffer. You can also use `'\n'` to insert a newline character without flushing the buffer. It is worth noting that in most command-line environments, the output buffer is automatically flushed when a newline character is printed, so `std::endl` is not necessary. You may use either. + +If you want to get an entire line as input, you can use `std::getline`. +```cpp +#include +#include + +int main() { + std::string s; + std::getline(std::cin, s); + std::cout << s << std::endl; + return 0; +} +``` + +You can also specify the delimiter for `std::getline` if you want to read until a specific character. + +# Using Keyword + +The last thing I want to cover in this lesson are `using` declarations. The `using` keyword can be used for creating aliases. However, I'd like to focus on what a lot of beginners use with `using`: `using namespace std`. + +You might've noticed that the last few examples have `std::` in front of several functions, types, and objects. This is because these are part of the `std` namespace. The `std` (standard) namespace is a collection of functions, types, and objects provided by the C++ Standard Library. + +Beginners will often use `using namespace std;` at the top of their code. This allows the use of standard functions and types without the `std::` prefix. +```cpp +#include +using namespace std; + +int main() { + cout << "Hello, World!" << endl; + return 0; +} +``` + +Many style guides recommend against this as it can lead to naming conflicts. + +Perhaps a slightly safer alternative is to use `using` declarations. +```cpp +#include +using std::cout; +using std::endl; + +int main() { + cout << "Hello, World!" << endl; + return 0; +} +``` + +Here are ***my recommendations for this course***: + +You may use `using namespace std;` for any programming quiz, pseudocode problem, interview question, or project in this course. It is generally acceptable to use it in small projects. + +Even I used it plenty of times before, but I've since outgrown it and have adapted to putting `std::` in front of everything. Future lessons may include it, others may not. + +# Practice + +Here are some practice problems to help you get comfortable with the concepts covered in this lesson. + +What is the output of the following code? +```cpp +#include +int main() { + int a = 1; + int b = 2; + int c = a / b; + std::cout << c << std::endl; + return 0; +} +``` +- 0 (correct) +- 0.5 +- 1 +- (produces a compile error) +- (result is undefined) + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int a = 1; + int& b = a; + b = 2; + std::cout << a << b << std::endl; + return 0; +} +``` +- 11 +- 12 +- 22 (correct) +- 21 +- (produces a compile error) + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int n = 8; + while (n) { + n /= 2; + std::cout << n; + } + return 0; +} +``` +- 421 +- 4210 (correct) +- 8421 +- (produces a compile error) +- (program does not terminate) + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int n = 0; + std::cout << n++ << n++ << ++n << std::endl; + return 0; +} +``` +- 011 +- 012 +- 013 (correct) +- 123 +- 124 + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int n = 5; + for (int i = 1; i < n; ++i) { + if (i % 2 == 0) continue; + std::cout << i; + } + return 0; +} +``` +- 12345 +- 135 +- 13 (correct) +- 1 +- (nothing is printed) + +--- + +What is the output of the following code? +```cpp +#include +void foo(int n, int& m) { + int temp = n; + n = m; + m = temp; +} +int main() { + int a = 1; + int b = 2; + foo(a, b); + std::cout << a << b << std::endl; + return 0; +} +``` +- 11 (correct) +- 12 +- 21 +- 22 +- (produces a compile error) + +# Conclusion + +That's it for this lesson! We've covered a lot of ground, but this is just the beginning! In the next lesson, we'll cover arrays and memory management. diff --git a/cpp-review/memory/image.png b/cpp-review/memory/image.png new file mode 100644 index 0000000000000000000000000000000000000000..3647114f0900a83d8c90f7ef6d27275200754d6a GIT binary patch literal 8071 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 literal 0 HcmV?d00001 diff --git a/cpp-review/memory/images-ppt.pptx b/cpp-review/memory/images-ppt.pptx new file mode 100644 index 0000000000000000000000000000000000000000..086173ea9584c16adc2a34a013bd4b925aa5494e GIT binary patch literal 33638 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 A&j0`b literal 0 HcmV?d00001 diff --git a/cpp-review/memory/lesson.md b/cpp-review/memory/lesson.md new file mode 100644 index 0000000..2fc79e8 --- /dev/null +++ b/cpp-review/memory/lesson.md @@ -0,0 +1,317 @@ +# C++ Memory and Arrays + +**Author:** *Brian Magnuson* + +In this lesson, we'll continue where we left off in our C++ review. + +In this lesson, we'll cover the following topics: +- Memory Model +- Pointers +- Arrays +- Heap Memory Management +- Heap-Allocated Arrays + +# Memory Model + +The memory used by a process is often organized into segments: +- **Text Memory**: Contains the executable code. +- **Data Memory**: Contains global and static variables. +- **Stack Memory**: Contains local variables and function call information. +- **Heap Memory**: Contains dynamically allocated memory. + +![Diagram of the memory used by a process.](image.png) + +The C++ standard does not use the words "stack memory" and "heap memory" and instead uses the terms "automatic storage duration" and "dynamic storage duration". + +To avoid confusion, we'll use the terms "stack memory" and "heap memory" in this lesson and future lessons. This is also to avoid confusion between the terms "dynamic array" and "dynamically-allocated array", which are two different things. + +In practice, the memory used by a process is often shuffled around by the operating system. This is primarily to avoid users from accessing memory that they shouldn't be accessing, such as text memory. However, it is useful to think of memory in this segmented manner. + +Whenever you create a local variable in a function, it is stored in the stack memory. +```cpp +void foo() { + int x = 5; +} +``` +The memory for the variable is allocated when the function is called and deallocated when the function returns. + +Functions in C++ can call themselves, which is known as **recursion**. Each recursive call creates a new stack frame. If the recursion goes too deep, the stack will overflow and the program will crash. +```cpp +void foo(int x) { + if (x == 0) { + return; + } + std::cout << foo(x - 1) << std::endl; +} +``` + +Here, if you call this function with a value of `-1`, the function may recurse very deeply and cause a stack overflow. + +We'll discuss heap memory later in this lesson. + +# Pointers + +A **pointer** is a variable whose value is an address in memory. You can create a pointer to any type by using the type followed by an asterisk `*`. You can get the address of a variable by using the `&` operator in front of the variable name. +```cpp +int x = 5; +int* p = &x; +``` + +Some people also prefer to put the asterisk next to the variable name: `int *p`. This is a matter of personal preference. I prefer to put the asterisk next to the type name. + +If you were to print `p`, you would get the address of `x`. This could be any address in memory, so knowing the exact number is usually not useful. + +You can dereference a pointer by using the `*` operator in front of the pointer name. This will give you the value at the address stored in the pointer. +```cpp +std::cout << *p << std::endl; // 5 +``` + +The variable `p` does not store the value `5`. Only `x` stores the value of `5`. We can use dereferencing to change the value of `x` through the pointer. +```cpp +*p = 10; +std::cout << x << std::endl; // 10 +``` + +You might notice that this behavior is similar to using references. Indeed, you can use pointers in a similar fashion. However, pointers allow you to do a few more things such as pointer arithmetic and heap memory allocation. These can be dangerous if not used correctly. + +Typically, you should use references unless you have a reason to use pointers. + +You can add `const` in front of the pointer type. This does not make the pointer constant, but rather prevents users from modifying the value through the pointer. +```cpp +int y = 5; +const int* q = &x; +*q = 10; // Not allowed +q = &y; // Allowed +``` + +You can also use const after the asterisk to make the pointer itself constant. +```cpp +int* const r = &x; +r = &y; // Not allowed +*r = 10; // Allowed +``` + +And you can also use both. But it's a little overkill. +```cpp +const int* const s = &x; +``` + +You can also create a pointer to a pointer. This is sometimes useful when you want to modify a pointer in a function. +```cpp +int** pp = &p; +``` + +You can also create a `void*` pointer. This is arguably the most dangerous pointer type because it can point to any type. You can cast a `void*` pointer to any other pointer type. +```cpp +void* vp = &x; +int* ip = static_cast(vp); +``` + +You should avoid using `void*` pointers whenever possible. People may use them to get around type checking, but this can easily lead to bugs and there are many safer alternatives such as `std::any` and `std::variant` (These are part of the C++17 standard). + +Pointers are usually initialized to the address of a variable. However, you can also assign them to `nullptr` to indicate that they are not pointing to anything. +```cpp +int* p = nullptr; +``` + +`nullptr` and `NULL` are sometimes used interchangably, though both are effectively the same as `0`. Whenever you have a pointer, but no memory address to point to, you should always use `nullptr`. + +Finally, on the topic of dereferencing, you should never dereference a pointer to memory that you don't own. This includes `nullptr`. Attempting to do so can lead to undefined behavior. In many cases though, your operating system will give the process a `SIGSEGV` signal and terminate the program. This is also known **segmentation fault**. A segmentation fault occurs whenever you try to access memory that you don't own. + +# Arrays + +An **array** is a contiguous block of memory that stores elements of the same type. You can create an array using any of the following syntaxes: +```cpp +int arr1[5]; // Array of 5 integers +int arr2[] = {1, 2, 3, 4, 5}; // Array of 5 integers +int arr3[5] = {1, 2, 3, 4, 5}; // Array of 5 integers +``` + +Arrays require a size that can be determined at compile time (though some compilers allow variable-length arrays as an extension). The second line above infers the size of the array from the number of elements in the initializer list. + +You can access elements of an array using the subscript operator `[]`. The index starts at 0. +```cpp +std::cout << arr2[0] << std::endl; // 1 +``` + +There are few ways to get the size of an array. The first way is to use the `sizeof` operator. This actually gives you the size of the array in bytes, so you need to divide by the size of the type to get the number of elements. +```cpp +sizeof(arr2) / sizeof(arr2[0]); // 20 / 4 = 5 +``` + +***This only works for stack-allocated arrays with a size known at compile time.*** + +C++'s standard library provides an `std::array` wrapper class which provides a size member function. +```cpp +std::array arr4 = {1, 2, 3, 4, 5}; +std::cout << arr4.size() << std::endl; // 5 +``` + +Aside from this, the only reliable way to get the size of an array is to keep track of it yourself. And even this can be error-prone. Because of this, we recommend to use `std::vector` whenever possible. + +The `std::vector` class is a dynamic array that can grow and shrink in size. It is part of the C++ standard library and is much safer than using raw arrays. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec.push_back(6); // Can't do this with raw arrays! +std::cout << vec.size() << std::endl; // 6 +vec.pop_back(); +std::cout << vec.size() << std::endl; // 5 +``` + +Array-type variables, under the hood, are actually pointers to the first element of the array. This is why you can pass arrays around despite the fact that arrays can be of any size. + +If you try to perform arithmetic on an array, you can access elements before and after the first element. +```cpp +int arr[] = {1, 2, 3, 4, 5}; +std::cout << *(arr + 1) << std::endl; // 2 +int* ptr = arr; +std::cout << *(ptr + 1) << std::endl; // 2 +``` + +Whenever you add to an array or pointer, you are actually adding increments of the size of the type. Here, we add 1 to the pointer, but we are actually moving over `1 * sizeof(int)` bytes, which is 4 bytes. + +You can also use this method to access elements *before* the first element or *after* the last element. This can result in undefined behavior and is one of the most common ways to misuse pointers and can potentially lead to security vulnerabilities or a segmentation fault. +```cpp +int var = 6; +int arr[] = {1, 2, 3, 4, 5}; +std::cout << *(arr - 1) << std::endl; // Undefined behavior (but it might also print 6) +``` + +It goes without saying, but ***you should never access memory that you don't own***. + +# Memory Management + +Sometimes, you will need to allocate memory on the heap. This is useful for a few reasons: +- The stack is thought of as being limited in size while the heap is much larger, so it is suitable for allocating large amounts of memory. +- You can allocate memory on the heap and keep it around after the function returns. +- You may need to allocate an amount of memory that is not known at compile time (a requirement for pretty much any data structure). + +To allocate a single value on the heap, you can use the `new` operator along with the type and any arguments needed for the constructor. +```cpp +int* p = new int(5); +MyObject* obj = new MyObject(); +``` + +Note that `p` is a pointer. We've already used pointers to store addresses to stack memory. Here, we're storing the address of heap memory. You can't easily tell the difference between stack memory and heap memory just by looking at the pointer. + +Additionally, `p` is still a stack-allocated variable. The memory for `5` is allocated on the heap, not the pointer. This means that `p` can fall out of scope, just like any other variable. However, the memory for `5` *will not* be deallocated. So as long as we keep the value of `p` around, we can access the memory for `5`. + +If we, perhaps by accident, lose the pointer to the memory, then `5` is no longer accessible. The memory will be deallocated eventually when the process terminates, but if we keep allocating memory without freeing it, we can run out of memory. This is known as a **memory leak**. Programs that leak memory for long periods of time can consume all available memory and eventually crash. + +To deallocate memory, you can use the `delete` operator. This will deallocate the memory and call the destructor if the type has one. +```cpp +delete p; +delete obj; +``` +C++ does not provide garbage collection like Java or Python. Whenever you allocate memory with `new`, you must deallocate it with `delete`. Perhaps the worst part about this is that you cannot deallocate memory more than once. This is known as a **double free** and is also an error. So you can't just delete every pointer whenever you feel like it. + +Calling `delete` on a pointer to an class/struct object will also call the destructor for that object before deallocating the memory. If you set up your destructors wisely, calling `delete` on a pointer to an object can set off a chain of deletes that cleans up all the memory associated with that object. + +Another important point is that `delete` does not remove the pointer from scope. Usually this isn't a problem since you might not use the pointer again and the pointer will fall out of scope. However, this can be a problem if you have many pointers to the same object and you run `delete` on one of them. The other pointers will still point to the memory, but the memory is no longer valid. This is known as a **dangling pointer**. If you have a pointer to deallocated memory, you should set the pointer to `nullptr`. +```cpp +p = nullptr; +obj = nullptr; +``` + +Attempting to dereference a null pointer is still an error, but at least you can check if the pointer is null before dereferencing it. + +# Heap-Allocated Arrays + +We'll finish this lesson by discussing heap-allocated arrays. This is similar to allocating a single value on the heap, but uses a slightly different syntax. +```cpp +int* arr = new int[5]; +int* arr2 = new int[5] {1, 2, 3, 4, 5}; +MyObject* objs = new MyObject[5]; +``` + +Note: the third line only works for objects that are default-constructible. If the object is not default-constructible, you should either define a default constructor, use an initializer list, or override the `new[]` operator. + +You can access elements of the array using the subscript operator `[]` just like with stack-allocated arrays. +```cpp +std::cout << arr2[0] << std::endl; // 1 +``` + +Just like with stack allocated arrays, you should keep track of the size of the array yourself. The `sizeof` operator will not work for heap-allocated arrays. You should not try to access memory outside the bounds of the array. + +To deallocate a heap-allocated array, you should use the `delete[]` operator. +```cpp +delete[] arr; +delete[] arr2; +delete[] objs; +``` + +Do not use `delete[]` with an object allocated with `new` or use `delete` with an array allocated with `new[]`. This can lead to undefined behavior. + +If you are creating your own data structure and you intend to use heap-allocated arrays, you can use `delete[]` in the destructor of the class. This will ensure that the memory is deallocated when the object is destroyed. + +Most STL containers such as `std::vector` allocate memory on the heap. You don't need to use `new[]` or `delete[]` with these containers. The containers will handle memory management for you. For this reason, you should prefer to use STL containers whenever possible (unless we tell you otherwise for, say, a programming problem). + +# Practice + +Consider the following code: +```cpp +int i = 7; +int* p = &i; +``` +Which of the following does NOT evaluate to 7? +- `i` +- `*p` +- `p` (correct) +- `*(&i)` +- (all of these evaluate to 7) + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int arr[] = {1, 2, 3, 4, 5}; + for (int i = 1; i < 4; i++) { + std::cout << arr[i]; + } + return 0; +} +``` +- 12345 +- 1234 +- 234 (correct) +- 2345 +- (results in undefined behavior/segmentation fault) + +--- + +What is the output of the following code? +```cpp +#include +int main() { + int* p = new int(5); + std::cout << *(p + 1) << std::endl; + return 0; +} +``` +- 0 +- 5 +- 6 +- (results in undefined behavior/segmentation fault) (correct) + +--- + +What is the error in the following code? +```cpp +#include +int main() { + int* p = new int[5] {1, 2, 3, 4, 5}; + std::cout << p[3] << std::endl; + delete p; + return 0; +} +``` +- `p` should have the type `int[]`, not `int*`. +- The syntax after the `new` operator is incorrect for an array. +- The access to `p[3]` is out of bounds. +- The `delete` operator should be `delete[]` (correct) + +# Conclusion + +That's all for this lesson. We've covered the memory model, pointers, arrays, and heap memory management. In the next lesson, we'll discuss classes and object-oriented programming. From 16312f2ab8eb91498ec9fcf0bc7eca83ecc602a5 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:02:12 -0500 Subject: [PATCH 2/9] Add start of classes lesson --- cpp-review/classes/lesson.md | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 cpp-review/classes/lesson.md diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md new file mode 100644 index 0000000..9fcb355 --- /dev/null +++ b/cpp-review/classes/lesson.md @@ -0,0 +1,56 @@ +# C++ Classes + +**Author:** *Brian Magnuson* + +In this lesson, we'll continue where we left off in our C++ review. +We'll be discussing classes, which are a fundamental part of object-oriented programming (OOP). + +In this lesson, we will cover: +- Class basics +- Constructors +- Member functions +- Copy constructors and copy assignment operators +- Destructors +- Inheritance +- Abstract classes + +# Class Basics + +A class is usually defined in a header file, and its function implementations are defined in a separate source file. Some people prefer to define each class in its own header/source file pair. This can help keep your code organized and make it easier to find things. + +Here's an example of a simple class definition: +```cpp +class MyClass { + int z; // private by default +public: + int x; + int y; +}; +``` +Here, our class has two public member variables, `x` and `y`. These variables can be accessed and modified from outside the class. + +To use our class, we can create an instance of it like this: +```cpp +MyClass obj; +obj.x = 5; +obj.y = 10; + +std::cout << obj.x << " " << obj.y << std::endl; // Output: 5 10 +``` +The `.` operator is used to access the members of an object. Outside of the class definition, we can only access public members, i.e., members declared after the `public:` access specifier. + +By default, members of a class are private, meaning they can only be accessed from within the class itself. To make members public, we use the `public:` access specifier. We can also use `private:` to declare private members after a public section. + +There is another way to declare a custom composite type in C++: using a `struct`. The *only* difference between a `class` and a `struct` is that members of a `struct` are public by default, while members of a `class` are private by default. +```cpp +struct MyStruct { + int x; // public by default + int y; // also public by default +private: + int z; +}; +``` + +By specifying which members we want to make public or private, we can control how our class is used. This feature is known as **encapsulation**. Encapsulation allows us to hide certain features of our class from the outside world, preventing unwanted access and modification. + + From 349e41edc5d6f9e845d8b6394ddc9afd51f4b1f0 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:33:33 -0500 Subject: [PATCH 3/9] Add sections on references and smart pointers --- cpp-review/basics/lesson.md | 13 +++++++++ cpp-review/memory/images-ppt-2.gif | Bin 0 -> 98721 bytes cpp-review/memory/images-ppt.gif | Bin 0 -> 110088 bytes cpp-review/memory/images-ppt.pptx | Bin 33638 -> 81303 bytes cpp-review/memory/lesson.md | 42 +++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 cpp-review/memory/images-ppt-2.gif create mode 100644 cpp-review/memory/images-ppt.gif diff --git a/cpp-review/basics/lesson.md b/cpp-review/basics/lesson.md index afcb4c8..261f90a 100644 --- a/cpp-review/basics/lesson.md +++ b/cpp-review/basics/lesson.md @@ -293,6 +293,19 @@ double add(double a, double b) { } ``` +When you pass an argument to a function, the default behavior is to *copy* the argument. If the object is defined by a class or struct, the copy constructor is called. For example, if you pass a `std::vector` to a function, the entire vector is copied. +```cpp +void foo(std::vector vec) {...} +``` + +This can be expensive for large objects. If you don't need a copy of the object, you can instead pass it by reference or `const` reference. +```cpp +void foo(std::vector& vec) {...} +void foo(const std::vector& vec) {...} +``` + +Using `const` is like making a promise to callers that you won't modify the object. This can help prevent bugs and make your code easier to understand. + # Function Declarations and Header Files This next part is ***important***, especially for C++ beginners, so pay attention! diff --git a/cpp-review/memory/images-ppt-2.gif b/cpp-review/memory/images-ppt-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..acd1420e81649b051ac638a36632b2f46c72cbc3 GIT binary patch literal 98721 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 QVIMYPC$?h4V?Y1^J7y(?+W-In literal 0 HcmV?d00001 diff --git a/cpp-review/memory/images-ppt.gif b/cpp-review/memory/images-ppt.gif new file mode 100644 index 0000000000000000000000000000000000000000..31b3a0e7ba5e107af59cec31910953a74f3488b5 GIT binary patch literal 110088 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
lLNg$4JZfvNx=R#2h0zLo_ZZhr7Q3yXlK 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 literal 0 HcmV?d00001 diff --git a/cpp-review/memory/images-ppt.pptx b/cpp-review/memory/images-ppt.pptx index 086173ea9584c16adc2a34a013bd4b925aa5494e..7203e7d8e43a73599a12796db1061ef3aad5aedf 100644 GIT binary patch delta 63742 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 W2ayUU!&U*QfFQuQXO|h^1NuMoDoE!5 delta 21355 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 diff --git a/cpp-review/memory/lesson.md b/cpp-review/memory/lesson.md index 2fc79e8..be66484 100644 --- a/cpp-review/memory/lesson.md +++ b/cpp-review/memory/lesson.md @@ -10,6 +10,7 @@ In this lesson, we'll cover the following topics: - Arrays - Heap Memory Management - Heap-Allocated Arrays +- Smart Pointers # Memory Model @@ -312,6 +313,47 @@ int main() { - The access to `p[3]` is out of bounds. - The `delete` operator should be `delete[]` (correct) +# Smart Pointers + +Before we wrap things up, I should take a moment to explain smart pointers. Smart pointers are wrappers around raw pointers that provide automatic memory management. They are defined in the `` header and are part of the C++11 standard. + +C++ offers two main types of smart pointers: `std::shared_ptr` and `std::unique_ptr`. + +A `std::shared_ptr` can be initialized using the pointer's constructor or using the `std::make_shared` function (which accepts the arguments needed to construct the allocated object). +```cpp +std::shared_ptr p1(new int(5)); +std::shared_ptr p2 = std::make_shared(5); +``` + +Shared pointers use a memory management strategy called **reference counting**. +They keep track of how many shared pointers are pointing to a particular object. When the last shared pointer pointing to an object is destroyed, the object is deallocated. + +![Animation of shared pointers being copied, then deleted.](images-ppt.gif) + +One way to think about this is to imagine a group of people watching TV together. The first person to enter the room turns on the TV. Each person that enters the room has access to the TV remote. Then, when the last person leaves the room, they turn off the TV. + +People who first learn about shared pointers might be tempted to use them for everything to avoid leaking memory. However, ***it is still possible to create memory leaks with shared pointers***. If you have a cycle of shared pointers, the reference count will never reach zero and the memory will never be deallocated. + +![Animation of heap objects referencing each other with shared pointers.](images-ppt-2.gif) + +One way to think about this is to imagine two people watching TV, and each person will only leave the room if the other person leaves first. In this setup, neither person will leave the room first, so the TV will never be turned off. + +This can easily happen with cyclic graphs, doubly-linked lists, or any other data structure that has pointers pointing to each other. + +To get around this, C++ offers `std::weak_ptr`, a pointer that does not increment the reference count. You can read more about weak pointers [here](https://en.cppreference.com/w/cpp/memory/weak_ptr). + +An `std::unique_ptr` is similar to an `std::shared_ptr`, but with one crucial difference: *it cannot be copied*. This also means that there is no need for reference counting since there can only ever be one `std::unique_ptr` pointing to an object. When the `std::unique_ptr` is destroyed, the object is deallocated. +```cpp +std::unique_ptr p1(new int(5)); +std::unique_ptr p2 = std::make_unique(5); +``` + +Since `std::unique_ptr` cannot be copied, you cannot easily pass it to a function that takes a pointer by value. The only way to keep the pointer around is to pass it by reference, or to use `std::move` to transfer ownership of the pointer. You can also release the pointer from the `std::unique_ptr`, though this negates the purpose of using a smart pointer in the first place. + +Rust developers may find these concepts familiar as it uses a similar system of ownership and borrowing for its pointers. + +For this course, you will not be expected to use smart pointers, and the projects that require memory management are fairly easy to manage manually. However, it's good to know about smart pointers for when you work on larger projects. + # Conclusion That's all for this lesson. We've covered the memory model, pointers, arrays, and heap memory management. In the next lesson, we'll discuss classes and object-oriented programming. From b5cee469404e3eca22fc48863d2cc6cea54be0e1 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Sun, 24 Nov 2024 22:36:14 -0500 Subject: [PATCH 4/9] Add sections on classes --- cpp-review/classes/lesson.md | 320 +++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md index 9fcb355..71ac1b7 100644 --- a/cpp-review/classes/lesson.md +++ b/cpp-review/classes/lesson.md @@ -53,4 +53,324 @@ private: By specifying which members we want to make public or private, we can control how our class is used. This feature is known as **encapsulation**. Encapsulation allows us to hide certain features of our class from the outside world, preventing unwanted access and modification. +For your C++ projects in this course, you will be expected to utilize encapsulation to protect your class members. +# Constructors + +Suppose we have the following classes: +```cpp +class Vector2D { +public: + int x = 0; + int y = 0; +}; +class Character { +public: + Point position; + int health; + int power; +}; +``` + +We can instantiate a `Character` in one of these ways: +```cpp +Character player_1 = Character(); +Character player_2; // More concise +``` + +Both of these methods call the class's **default constructor**. A **constructor** is a special member function that instantiates an object of a class. A default constructor is a constructor that takes no arguments. + +Since we didn't define any constructor for `Character`, C++ provides a default constructor for us. The automatic default constructor calls the default constructors of all the class's members, except for primitive types like `int`, which are not initialized. Using `player_1.health` at this point would be undefined behavior. + +To define our own constructor, we can do this: +```cpp +class Character { +public: + Point position; + int health; + int power; + Character() { + health = 100; + power = 10; + } +}; +``` + +Constructors and destructors do not have a return type. + +We can also declare the constructor outside the class definition: +```cpp +class Character { +public: + Point position; + int health; + int power; + Character(); +}; + +Character::Character() { + health = 100; + power = 10; +} +``` + +To define class members outside the class definition, we use the scope resolution operator `::`. This operator is used to define functions that are declared inside a class. Remember, it's a good idea to put your function implementations in a separate source file. + +You can also define your constructor like this: +```cpp +Character::Character() : health(100), power(10) {} +``` + +This method effectively does the same thing, but by using an initializer list like this, you can initialize members that cannot be assigned a value in the constructor body (such as `const` members). + +You can also write constructors that take arguments: +```cpp +class Character { +public: + Point position; + int health; + int power; + Character(int h, int p) : health(h), power(p) {} +}; +``` + +However, if you do not also have a default constructor, C++ will NOT provide one for you. + +# Member Functions + +Member functions are functions that are part of a class. They can access the class's private members and are called using the `.` operator on an object of the class. + +Here's an example of a class with a member function: +```cpp +class Character { + Point position; + int health = 100; + int power = 10; +public: + void move(int x, int y); +}; + +void Character::move(int x, int y) { + position.x += x; + position.y += y; +} +``` + +And we can use it like this: +```cpp +Character player; +player.move(5, 10); +``` + +Even though `position` is private, the `move` function can access it because it's a member of the `Character` class. + +If `player` happened to be a pointer, we would have to dereference it to call the member function. The syntax for this is a bit messy which is why C++ provides a special operator `->` for this purpose: +```cpp +Character* player = new Character(); +// (*player).move(5, 10); +player->move(5, 10); +``` + +All non-static member functions have access to a special pointer called `this`, which points to the object on which the function was called. Earlier, we did not need it because `position` unambiguously referred to the `position` member. However, if we had a parameter with the same name as a member, we would need to use `this` to access the member: +```cpp +void Character::take_damage(int health) { + this->health -= health; +} +``` + +Notice that we have to use the `->` operator here since `this` is a pointer. + +Both of these member functions, `move` and `take_damage` change, or **mutate**, the state of the object. Sometimes, we don't want to mutate the object. And in some cases, we *can't* mutate the object. +```cpp +const Character player; +// player.move(5, 10); // Error: Cannot call non-const member function on const object +``` + +This helps make sure we don't accidentally change the state of an object when we shouldn't. But not every member function will mutate the object. In these cases, we need to tell the compiler that the function won't change the object's state by using the `const` keyword: +```cpp +bool Character::is_alive() const { + return health > 0; +} +``` + +By marking the function as `const`, we disallow any modifications to `this` inside the function. We can then call this function on a `const` object: +```cpp +const Character player; +player.is_alive(); // OK +``` + +It is good practice to mark member functions as `const` if they do not modify the object's state. + +On rare occassions, you will want to create a member function that returns a reference to a member variable for the caller to access and possibly modify. In these cases, you may need both a `const` and non-`const` version of the function. This is the case for many STL containers, like `std::vector`. + +# Copy Constructors and Copy Assignment Operators + +There are two ways to create a copy of an object in C++: the copy constructor and the copy assignment operator. +```cpp +Character player_1; +Character player_2 = player_1; // player_2 is copy-constructed from player_1 +Character player_3; +player_3 = player_1; // player_3 is copy-assigned from player_1 +``` + +The difference between the two is that one is used to create a new object, while the other is used to assign an existing object. + +The copy constructor and copy assignment operator have these signatures: +```cpp +Character(const Character& other); +Character& operator=(const Character& other); +``` + +If you do not define a copy constructor or copy assignment operator, C++ will provide a default implementation for you. This implementation will simply copy each member of the object one by one. + +If one of your members is a pointer, this default implementation will copy the pointer, not the object it points to. In other words, both objects will point to the same memory location. This is known as a **shallow copy**. This can be problematic if one of your objects will deallocate the memory it points to. The other object will be left with a dangling pointer. +```cpp +class Character { + char* name; +}; +``` + +To fix this, you need to define your own copy constructor and copy assignment operator. This is known as a **deep copy**. +```cpp +Character(const Character& other) { + name = new char[strlen(other.name) + 1]; + strcpy(name, other.name); +} +Character& operator=(const Character& other) { + if (this != &other) { + delete[] name; + name = new char[strlen(other.name) + 1]; + strcpy(name, other.name); + } + return *this; +} +``` + +Notice how the copy assignment operator has to return `*this`. + +On the rare occasion that you want to prevent copying of your object, you can delete the copy constructor and copy assignment operator: +```cpp +class Character { + Character(const Character& other) = delete; + Character& operator=(const Character& other) = delete; +}; +``` + +You can also do this with the default constructor and destructor. + +There is another special set of member functions called **move constructors** and **move assignment operators**. These are used to transfer ownership of resources from one object to another. We won't cover them in this lesson. + +# Destructors + +A **destructor** is a special member function that is called when an object goes out of scope (if allocated on the stack) or is explicitly deleted (if allocated on the heap). It is used to clean up resources that the object has acquired during its lifetime. Like the constructor, it has no return type. It also does not take any arguments. +```cpp +class Character { + char* name; +public: + Character(const char* n) { + name = new char[strlen(n) + 1]; + strcpy(name, n); + } + /* copy constructor and copy assignment operator here */ + ~Character() { + delete[] name; + } +}; +``` + +A common rule of thumb is that for the copy constructor, copy assignment operator, and destructor, if you need to define one, you probably need to define all three. + +If you don't define a destructor, C++ will provide a default implementation for you. This implementation will not delete any resources that the object has acquired, which can lead to memory leaks. + +# Inheritance + +Let's say you want to create a new class that is similar to an existing class, but with some additional features. You can use **inheritance** to achieve this. +```cpp +class Player : public Character { + int score; +public: + Player(int h, int p, int s) : Character(h, p), score(s) {} +}; +``` + +Here, we write `Player : public Character`. This means that `Player` inherits from `Character`. This allows `Player` to access all of `Character`'s members and member functions. We can also add new members and member functions to `Player` like `score`. + +We interpret public inheritance as an "is-a" relationship. In this case, a *`Player` is a `Character`*. +There are different types of inheritance in C++: **public**, **protected**, and **private**. You probably won't need to use the latter two in this course, so we will focus on public inheritance. + +If the members of `Character` are private, `Player` will not be able to access them. If we want `Player` to access them, but maintain some level of encapsulation, we can use the `protected:` access specifier: +```cpp +class Character { +protected: + int health; + int power; +}; +``` + +This makes it so that only `Character` and its derived classes can access these members. + +Inheritance allows us to create new classes while reusing existing code. This is a key feature of OOP. Inheritance also allows for **polymorphism**. + +Suppose we want to change the behavior of the `take_damage` function for a `Player`. We can override the function in the `Player` class: +```cpp +class Player : public Character { + int score; +public: + Player(int h, int p, int s) : Character(h, p), score(s) {} + void take_damage(int damage) override { + health -= damage / 2; + } +}; +``` + +Now, when we call `take_damage` on a `Player`, it will use the `Player` version of the function, not the `Character` version. + +In C++, pointers of a base class to point to objects of a derived class. In our case, we can make a `Character*` point to a `Player` object. After all, a `Player` is a `Character`. +```cpp +Character* player = new Player(100, 10, 0); +``` + +This has a few caveats. +First, we cannot access `score` through `player` because C++ does not know if `score` exists in this kind of character. If we're careful, we can cast `player` to a `Player*` to access `score`. +```cpp +Player* player = dynamic_cast(character); +if (player) { + std::cout << player->score << std::endl; +} +``` + +Dynamic casting is a way to safely cast a pointer of a base class to a pointer of a derived class. If the cast fails, `dynamic_cast` will return `nullptr`. + +Second, if we try to call `take_damage` on `player`, it will call the `Character` version of the function. To fix this, we need to make the function `virtual` in the base class: +```cpp +class Character { +public: + virtual void take_damage(int damage); +}; +``` + +Now, when we call `take_damage` on a `Character*`, it will call the correct version of the function. +```cpp +Character* player = new Player(100, 10, 0); +player->take_damage(10); // Calls Player::take_damage +``` + +Third, when we delete a `Character*`, only the `Character` destructor will be called. This is bad since `Player` has its own resources to clean up. To fix this, we need to make the destructor `virtual` in the base class: +```cpp +class Character { +public: + virtual ~Character(); +}; +``` + +Polymorphism is tricky, but it can be a powerful tool when used correctly. We can have a collection of `Character*` pointers that point to different types of characters and call the correct functions on them. +```cpp +std::vector characters; +characters.push_back(new Player(100, 10, 0)); +characters.push_back(new Character(100, 10)); +for (Character* character : characters) { + character->take_damage(10); +} +``` + +# Abstract Classes From 858672571582f526c1b639e3870c8e4af0c24ad1 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:47:03 -0500 Subject: [PATCH 5/9] Add more sections on classes --- cpp-review/classes/image.png | Bin 0 -> 12858 bytes cpp-review/classes/lesson.md | 91 +++++++++++++++++++++++++++++- cpp-review/memory/images-ppt.pptx | Bin 81303 -> 83168 bytes cpp-review/memory/lesson.md | 4 +- 4 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 cpp-review/classes/image.png diff --git a/cpp-review/classes/image.png b/cpp-review/classes/image.png new file mode 100644 index 0000000000000000000000000000000000000000..45a3fcafe8e997d32b971aeee0368be41e90cde4 GIT binary patch literal 12858 zcmdU$cT|(xw&*{K2uibTLAn*)BB1md6crEzq$4eC5TpyCNJ~Hzwn|e(KuS=gg{nZ1 zn%F?4M8JR$0xCkJ1cVSm2qAC9bH*EI+;{&tZ`^yw8}APWlaKk$HCM@+YyIZT9cxPy zksVSyAP5pMGd*VmL45oW#Iq(S0G{+4nva5CJO~?;vruin%q;kW-}lU=GZ6GVW9O#l zHt@I5byH^q1c|=k{_u2%RCq(sDT3L#Gj=!JspRP1!_)DKzoew~Edqt#;*Dg4zj*Ta zz1@|k=D=%nGlBnaj$n?Fj5FVZBcdNn-^-lMbuvA6O5xp6@1*-`->;mP+{0sjI4Luy zr~h^DpK_|^(DO(8C8bqGO?qRnI1PI>gG)FDi5Lpq4|7p52*Fdhr5+feQvPv`=ga9ma5A5G>Q zfLo>;PTlpvVC3B6gVeUA@}jNahIap5Uj1Kn;eSXOZZRH5>mw$K8GhMRFH&y(`E*0W z`^(iFx5q7z(vd_c;fc=r*QESPj4pe1DE~P0=z$T0x0Z?iai196Ms+Y?Ei}*x7J5>2s~~wezGp7;U9ZX-FB}?IVi_{hGMlVX2c9 z95Lb+Wp4#zha1$10Q0iI{GDfK;)(W-_AF|%2Ynntu+Pw6F*WEXp4wbi4GhdXj`oG&OhN$U4iyEy!Wuo;logUBR_A#k+8YS^5Lm~+Lp4`g%>?@4ZrrI zSft5XX#%A%%AL*1E4cCf4t>S1*CU=zq{p0gz47ffeMtOA+|PK z0NR&h1l9A8sm-+D*PeIF1jqxiQ0XEq?`d3}Y+88D*Gh#AoGM<=aWjNZKH@3xE@^DmH zdEDv|Knki5*$FA7U9EDc8T(?v*ZcFQTJ5zm%-lEPh^B3?eLt465F_A7~$aIKpQCm76K?b@g>dShR)U!$Vkvu_h8C3c|}yyUA4 zHwH3>Un%r(2ISe7>D{Q!Zel=PheOB8#}j=I*luyl?;=W2ZB%Skl9{`SUflORXs}?A zuzY{MAsUl^#yICd!l_5W`YpvbraxvA$x)MTS}#>ze!bcEW`jPTf28@*U87npZEE8X z#$37OSqxb4bG0Td6AHw8?#&Z10pxnZ1|rQkmh>sGZL;vr6`>PBIi*Ty@y`Z_1#c}K zhMaVHdGNbUoAcj0Zy?89ZubAkG#0ItCbq;{Nl`n(96BAPHp$J0E@{79?vkFrmw!lv z?$9c6m1!q>rKRftZTF5BRQ;67A2%tc!~>pBCqKEX40MP<$tDVr6E8JL3!z7tAl;jx zsDB)?UM!Dd{*2-Y+n8tMql3@46u)HjB4dxjvTr)HZlAuAl4Yq|nb&Y$T5|&IE-~YT zPS&DJ2IAFqn*O@nzJ-K3uASj5WzstH1B{j}`P^Z2!^s|3;r%JnZJS~56 z(>mu#ff;AP7v>VbF@&zo36f^Qww5#Ii$4h@7qnPqu77mww9#rDI$5bFe%N$#V+2=g zd`@a1+M@Q%`m7b|N=o7)DW{XxuSX}RydWDe#v2xgv!ld|BPjL={WQBEV%V8} zzK6M(xVEo^9r&gGNvDy{ANTa@7RBF=ugCGyzF|x71utt3q$+b`ldJK6Yux-F3OfIO z_^$sCJC5W|+@f%gZW}X0DSz^K@#GKjf#|?4n%j2s@4vSqXs97zdoH|ZVo5mUWYwdN zf&H9zHSh8L7>~%Vkf>yjh_cC1r<1YedHtKsy2cITFSH(aM-E?RWtrrRGu1LQm4AtW-m^EnGQ#KX0xz zDX^h^&;6_Qi0mapT&`kKVR$k(ymn>^W8b7-+erRJfKC1)!}3@fM3fx|+v8FL*` zlm0W1>TwWBgt8RsyWLal_3AcNh--yLs@b;^9Z{`VreBuv)>oV*D_3M5UFAM6+>yZt zj|0b`J;gNwaXxj%RkE-qUkZi#cyg8T(cH>`P{+!dDL?t5$Zkj3&TaQEzM7v$Q>!V* z?fDW;DT+g>&+{-mv-?&*-m{88Hos`-?WDI?zBUSI`$Nwz1^LZ9-}oJEUJfI#XCHMC zys``yKx*Eo9pA+IyPgPRwl62@lH%TW59$}cUdol5>SL&tDb8g=z9sM51E^o68)J#` zTLg{+!QA=_duY2u>_Yst$smjrl&T1Vv_&sgs{UIOMOTDL?;AfUy3WQ`)Jf+a7jE2r z(B_XD%N+f&-qC}E1BCNL2)+sWcqq`2nBZxn0ZF33#wK{>ng;xM#XpUmOO4ThW9>ws zu6rO1zU_K0rRstafJ&^mn^l&LNbX7C{=gA&NO<6|BcG2sFxe=`5Aiu%`NwM)l8hi# z1q@F^xj$4N4rbu|GpTx2VBrlIB_&>B!aMK}RT1tET;0U+lCxtE`}*c8JveOUwg z3EaK=M9K*CD)5p5bhOAHvIURD1rvlyrSPuc@sT}(33r}K;m=k|L8ZF{6P}k#;T6F1 zQlRr3=+px_3mlHS?)pRKW<)6W950XRK07{14U7Q(8Bn?pl(elipsqqAC{>0Cb!B6C zRMYu+;fE^(RL$%}5<(A(L*^GX63jq{Q*{#|NnIjz@fnc+1hNzn`f`p4Nge@Kt-*^L z_I&WYg8X=+3IY5$XxjX|0<tCGNgk0iJt?Zqq*#fUCshZ` zl{J?0Z+w=t3&6-ft%Y-xTCm<+bBWFe~wgri>L5jy#is9vTs$3;9NnaT$;=0yzuF zpilMOmqimH0aFbK9)l66Uj;2dL@1%fRwJSGfH?l(Wf90p1~l!;%cBJR$A7Jm!haRw zR~5tXKyOO@p`=6Nc$o?TNXfvS&j~2?8Uah{l~VZc;)3uUKxxXD2+de2Bq(#`OF*_% zNDu`rd;sn>91^!y0`h5K6tsM|L<+K2w&z<{O-wilY<>djSaHGJYv9%1bHs!}A$|+6 zP@oxOVuB5jg@L^99){=0E!=tk{=(tYpnuw#5j4YbpZOp86HfDSXSc?33 zyxh*wEyA81wZAcTv85a->gW+4p|%}<`ce}?Rxw%xT>RW3x@Dt2*Bvolo6;J;Zp>~A zozcD`keD#mw$$m;u{vn(A_5NJF5uc^Vn5=6VmqbWe7CYj3K>C_15X^MZU^21a7D)Cl^v25Vou=;1J(mbD*QR>S1K!JipE z!Kl&TF@gPMG4Ut62exEPC?*QI7cM4J3J{h}VbdSy?kE;j$N{?03VavpFZEypIM5bt z;B1my9YQc*RI~Q26`gt?ITXd|U`&wOV6qv4FZ567v(G3y=p#&PiJHdr>u1&ijDAbkFCFBr`_& zy9vuJ%jWSgb9O6@QxcD&At@anSTL9E@^RMlwj!7-)A<>f z@`~mSwR&bw4b)PA!&Qvt7VRd6q*m{gZ+g_gVtIMi$o=4R;Ku5xR*qYkAG*VD1tu%e)YCF>%%yH4#lA>gBER6>^?2jpCR+9>I@_CeWK7(4W)hsukzo zXVS^hltTKFmHzVEnDLL1S=SnBBAFJHg|m^n$voeGmSog+3+zpf}5me!xr?z zIOp($LEMz|WJT1o=pwUGwP-+S=11}httEHf0;)Hr%kNoc2eXJ@)% z7S3ZMTzM_BAI8~iH7D|k>DMz2dNyzy#JXWr27l=&e}jICK4CSwcYo=PpHEWeLfew~ zBqJo;!UtyJo!dePnX?N^4TQoz=SlV54S|eKJ>&FH9Z`y8)N3I{b@PzZU~t^Ms@>YK zaw^FSG=%HN=TieF@?fF}q2W8hpzIMWyWV@M`}5R7_!!5oM)O;-h|i)qm$7QW0EcAQ8!WeSN~7nQ3@K>nWxqfCyv0D#Qt5d>wU^K zP5HN*Zeh=@BlmUGMf^E>hyF;K_GNACHf-|^th#$=Hr1Ol7<3Bs++6hZs3-ZxR9fHo zrQJ`%j-C+J`H>l;U#KY=DepQK=DSsQa@bN9o;j90!o9_3v^AxTgZ0=ZXQi07qHcta znXB~a-$ymWxJ8khd-bt38f<%QA=?zvI2$> z8|15cqg}}&(sNf?Za+R-MYcv?BEQiXakWK#%G#t1p7&R_N&H#PR&9Re{Y0RtFmii# zn>syXVE~^L3d*SR!2TMbd}H-L!fb_&!BuP$>^l2aQV`ERN`576cpO`ak=oWH0LJWZjR5?Af2O&~D??Ymk9R zK5S;F*Ie!OWK2bT*731yV`aao64o=w_fINMsmDmo8a`*TuWa%p{_y+d6CxX~Kl8m@ z(nG1w8$6<(4cDimE33QhhHR%kOpD=Hfcqy91_12Z^ zEv)hQPsuzpu(%V=+b%g4O;B>_ zZ_n#h@2@6VOnC7?tXD<}Vx8f4rmA-sH=hry&cdXOwmrac>6aDBn|;a$_H&JVu(2WW$gde)o5uItDg z&KEy@%GrvzVg##yG2(C{1$HA=W%{9PTbo$Z{D)2K;Zeh*VXVP5SR6|RLAkYdk@Nlq z^LlB%O~}=!E|Ku#UNcO(`=_kNiABjFc{S2w%gCcipcxX3qsH3hX zXX@v^sc;!tqSw#gc(s!A+8n;bhaJbxl{PiBZC@$|NEKFrWY2qy`0iVgKPF$CCapCr z!n~EZ8nCc-&tvoHmUZdn&E*VK`vwKIMcD}6mdA<3F=FYP)l(qHP=U%B{ITD+;IgCC z3gW~NIMU!;P{;HVYmgShjMqC=>`*iQX)x64duAeWKV95IH zYlbC9k~ZFu4bEZn>b?0MzjDWSmnQ`Br8~{Jaa1V#sKjqoFx* z?8mfq{U!cNcjoDb1ms#n#JeMeQ%l{rt$Cb-2lJ!joUGGKjeAF{b4*Vpa8aE9fKn(+ zv&hc2il4KMs8pL;LNeO=#=l9I5{}h3U1rAl$mhk|OT|z_l|())+-txsY7z~#vXiS1 zv4$2L5rM1>&U(fiz=}Tc3-7nIMY@$pQZvg9*~zi#H0JjvnWPt;sW2{qCiN{JkZ7@t zvIu0aGYEe%HrHhXW!mEM>s>ePl`YG ztN5NXyoT)mG*+e-*yi_OfYPv|q?;1f9_Tt@(fD}kulRyZE>hI&(dDT6U7$AThPfr@ z25y&+^l1W&aCEb=sTsxer{g#ysJe+*MvadsWKkA`b#{;cp4DcLo77QWqrKX`WDj#^ zb@;#8K&vC**ZFyq7c*h&bpRd~eznuAM%BjDsI_klHTB6rxxzxcu?rDSO|*}k)70mx zp7_vAPjH!UT@bcCo*Qf;S-H2pb8B=iJEsW1Hh5qYF@dlUajj{pd~IQ~-Hn#N+;+<;-^GsV|4lYW@`$j&~Z`kDwh~SU40hBgz%j))9=c4aW2mC ze8!US;+Ek?5&%ODp^!4VdKipg4K-=85|P>v1Bs^xY1=1N~v8PP&CYky^Mo^}Qs{cb!}A2@blAP%6ZyZpRecL9~B*GSkc2&e~;_a*srpmg830zadG zzd-=!DO3m;?FX^~kk3{M7y*u!YYk*q@VwJA|GgGC$DV6VOTSoB)LRz*?hN9XzhsEtqhmiLL19ptsaohvC^{25f8x9-IcuYcEjH z1}O7>i9cSO%L=mrYE`%AyHE(`W)XOxR3W8$k;@8!2VN$`gi^o+Ee-+?0J0VaYfN<( zC>^Yjs{aC%Y(TT;E^ELK0C_j??5z!#So0--1&V)bt5GZu7VIT}kdI*mzzA}&@!e~|_(NRCoRExpJ*^kl6y*QxR!DO!Np5nxr<2zO?v~My1o?u zR>}fOx#IVnxk|^t`cU?Tcr~u7);|^I?L~_Ox z`>aya#B|#>IIa#Sd(7CAfsZw^(nyh8qgdL@>B41`M?{*W*uU0@EFJ2Tgge|y1Vpg> z49BJL!q#shm@ma*ho|q5b_`FJ)jjhS;6ul7IYr@AS#EX+bb2tZdI-OyzBcsJY6`dU zr7WR-xmkCLKhg4f1t{V<|LLk=Zq~mZRC!A9+}z{;Gc1_e1g=uJ-+&Gcg5R2>&{ioZOqp>7D8QMKUTfD2r|(d7B}~v>Ea*O@WKkX;U{ieu4Jj`{nTaMYy?v&= z7D@IR8~I{2e18%o&+UBL3M+qv?%(*(N}Is;cT5{Li_y;x_x%v?PpIYl=mHZcVVNQ9VV4kM zUBGizudm*Axf@@NuvuNG4JM@{X!4$guRFF)oQb-Rv#M2j3F=kyTc9a3;PUIr@}esl zbuBZGH-tl^!v9fG(-v3|H4#l;@(lyEF~dER;X{{*V4=9xDH_LW<-HMuwaYaR{@uR< zlqfUPYFjLj@!wzw?W!r*W`$l+EV}U*4G}m}nCvC>^xpJ436JXT(TQ-mn4eEtA7@fw zpcJQXJnw1;IPKTzjHv#o)xAgdMFP-V%`v>!QFyDa`q2DG`Zj9p{aM%I!cV72n7)tM zC+2sUGJd6n#Fcbr>Tp!{(fThy=4TY33+__Eeh_Oc!s@|A=6vU_uB-L zMfLHI@vAP|wfRm3xonJTn|=1@VC?F*2fL8@b*=w^P| zVg;qL$_NJ6QP4 zaZwG8zpwT&h_kjzB21~p&(}0-ng{O?qK;BQwF|16MWt9owEl6mMG5DG1&hkZUo}R0 zb|AR|d!}6y047a^wVh|8RaQ7xu}dbr-j9~#Y$`7{*PID2;pK+hV;7|;K{*-W_Opib z`D&dVgYdqvmIf;l&VYPtWnFzeR{AC={|SwE(0!%AUZZvJvoc`84+`*j5 zr{{jV_{sET9Ki5%ze2en5yvA5Vw!cT`oz#5N8?`)T_fa8EXMXwkTmw;y+8U5sZl&X zp6dh@2yjLKVDhOv872UX&l5C6gGx@3+^f|-j7Dz$P=r->zj-*nE7{YDA&}%CT!MT!?&sAmuar)ey0yt;(v(gQKM%k zE=M&#!tS(*nq;_6Wkw5a8;vY_bGAvM*N4S+?=EhX__nswvL(v~#@;GZ%L~>6S6!9) zDA}_U<(sHkqz5IyuucsA85{uKo0sVN-Wzf&Zzf$rT9)XiO(8cThWuDLQRb)>Buz~F zYr@8&5qq%&-34bjFM!Rg+#NefH6SHVoo!uz)|z=Cu=T*ZC>)CnsHMJ-@}%*nIjRSm z-bjiEC2Mn`Cr~WcR5Gi%A3^O1u&rweRJ0-IrIn+Rt#WA87L)#xbgEm%Hp3&9+7zSj z!Gzs+DZ9XUH!XBus8TK7gdbnwg!Lz4()!f#ssCCbsd2+EuBlm|Z*)z)+V+&G>EGdf zX4kKko_gFB-M_aSh9dpym4KHnkJTO;tcc~X8S~(jA5QmcB3*g|%f3BcdTeZ7G_3py zsC?_4298CL;zzXUrj&Vypg$j(4{D(Xm*o`QtlnQ~v!_SX8;^ z6%2?-6Lug0pV{TTxbUFMQ7X+Z!Ka|hb0#V!@jW^5MW9r$GdBAwEm!@M8Z3>dzHdl- zAvmFVj9TWI-{mbgRI4(wJ6x-NsPGtLkq}9Hca{3W?|u2HBA38^2f3l-bYZ4W;z0>5 zU+D(wpX!rK2j0^~sR6-+6^e#8vTjpkrR_bU&v{c{lb|NDRQc?_K@K&JqBl7j_k8V1 ziriRl;g#2pTkb-!+zqQ5Ri^r>W-`cRPvna0?sIK#j2fGB`lg_+#2ugltKY~HTiK6Q z)2g&Q44?VF;<>`DQ@afkzGkgyrGE`heAoe(0rd^_rjcN0ZEbVvtPWJ36c(v}2r6%# z4s%02PRB(O>be8ULVa2y@pL}u>Mp^5w`>=m!p&t7mD?7;%@ThY)cYQN3owzB7~=kP zNGEemM4aOP`_Wd*3H5vJ0krdn(L_3|=-#)4hjwEx-|B_Fuw9se%$coT<3i4|uc{}k6 zV0w%n{0_Mepo9!TJd~kt!^p9c-zYfl(c8H)+Ml>xPCJwOY#GH(iuUBF)QuD#7|P3` z_Irb}PfYjkQraTR;hcYFsJ17Z5f_A#y}9S7e!ZpkR2`*Eox9?R=Wq(HgJ12xRh={J>L}M`1qY_ z1+~$a!J@NqU;?YWG7PY_lD%CDxJgh%0oI%3`qb;?DNz^UbNWla$1c;DxROU;F& z{)9z_o)=n;*|KfcqFFv@N%G;&%yJeoaa_a?MCh7w(!4w*DGcr}rZKFM@`2djB-P4* zZf6kO0g5b%mU`6HCl?S><5Y>*OIMXicd}17YT6D3g!~b+#iWc(1yh|jN8Dp;(T1(oGmvbK5X zyeW!Zqp)}m`r?Ov5;n)B8eOEeTAER<>y5s2un9+eozC&7#l2#bfXBEGB zDwCM~QJuCaiTtUcfVnYGuPN^G7m!V~?%-^(BH$k~!4`$}RM;)J``Sv{yZa-#2c9Sr z6q_~su(x;;UfCXiX5Q|9-;zHUsHddKEphzM%J2Ce1#EYPLELNlzq|GPm%m+xHIRDU| zd+s^+`;zC$>~Cjwvb*m)yR$P3y9TekM2kN_wE0DuNi$6hLa4+H>yRT4i2 zLF^Z(33?A0&nVdJOOj&k3=8|+*wk*GfK6XI_s5gOYpFjW`M#-ys|IBN$nDbv;Rt5srx-MB?P_*>_M zP!P3K)haC_efODlFE@=l!v{=EW=c$p_rX`FZS}o@SlBkX&U#ZkYhp&J-+^;hidv=??F?)Q z=miZc5~23r-v-)!6TA^_waIKqeCnIPUcNRg^HU65x;K*;!@4h7d(v2(Re4t21BrLi zDV@5<7|>>Mu75AhCAmJt$@9$nv>D-O++1{C)pUM*W7Qq2Gbn9^U$~RZDWHA>Y`FnG z_=-B*hq?sC5959UYGp<9d_{2D#f_Nt9P;9DVF0adWM;v%Qzml(5wrs2{Y4AY}mCT4G zuepaYtJ>sqZ@wSn%NJ`*>HWZHHIZ~o??9@V!K7l=4;`{r^5_zYVxIV-OiPdeHS_q` z(o#p6G4l3Z@vK%1IhudW?vYsYLD+a-YRJ!yD*xB24og%E!*?J6;Qk%~01ZXQs+I=x zA)p#axgZ|GYonlk$W)MdE&{&;#(fIfWfeZ5b|l>5DvpU<6{$QQfFSqd;uE?Bwe6aB z%Z_**#>%@08)%}-N0ldWX|vS}K7HvF_*I1^;MG)aC*6c85A{}t?Mr3~+zmOIlClh7lnYWmx0jDVJ6rFu?48+jjjOyCSxDsafj#3|Dwnnom!+)c|Je6>sb@2u{#)hL zxeQOjbV9r_^3ZDC;}M8vQPM?%xSXqN5A!kDLnsVk?F;2s0!<%86xpBN-|s9hESeSZ zl5?Isxxx!YI=A})Art!a)^=^Q*WaIxEYZF@|W_hPJyMw5jx7rD#fC`n$j60k&*hk0akmc)P&X86%^@44b`EBT2jR5g?b&2l^hM*MB^ce z>nR+35x?G{9OzVK%=?9(c55u&J4U^2l}AiK8i4X)SaNhsfs;uD{di?!(iag)avqKZ zz&-xrliSb)LmXlBakmg!pQ>^66q0~!F3RxJK80o*=i2(DA%gi^Ln6IlZ35J*6S`JK z;*5is-nfs^AP3xN6z@}6==G$kbW20`dUN|#P^fe(!d)Y~6Ow$ir98P_L0{F^XY6~m zO?|sn;)zYlx5LjgiTC>myuQ7xS}^O@i*DcFT^!&&y`h4x;uAt+YcZgiRirR+4j>w| zxoH@N!VJWL%HrWv*P^fIqV;FJOLIpA0KDj-tEof~9xe`dJKG<6uVPY#2z-sK?-ABK zz8RZ!JX2=HaDSKgvu?NMdKe%->I5};%~O1}JVPwU12s?iIs76nkyvPUYj*402TR_t z{o9K?$JCQ@tKDE!qnG({GuBYTGaD1%yUzgbsB+a^Hs(|jqoiLRmTf*KC#n?-9y+f> zK9x6nK&rTAe3pkTt2qp|w8mR)=39uI2SRk@IVmq~5|1`iO7#+W&0qd3RS2Ia|8XgN zKIHT=*JCnQP|NU_CvFBzo>S~#T4o`tq;{)x`nUyufN2kzqZKzUPsf7cz~K7*R^x}= z1tSlyDc=>FtC0olMJAp&&WS>(LT*nQCVpUwC#2LNfy>LhjkL$S?d7q;l8kNdYm@Me z<$*n==*`q6xijM?GUb_rnC<+%i?DOsMdP~qqDTeNcO+P(-IqxP+22ce1T%#%j?4F+ zSJ=B(a`Ur$0%2cU$41`A9=INk3PA zQ>2kl#b!!f25SbBwO?ajeY!V&)?X-tZW^Ncteq1PBS^QFmfxV2Cn{GTRjA;Jj-s3L zOY?F4CtqE*O!}f0a`ltsQ_#peIvbHwoUWO6ruEd7cc?v_H7ynNw&aOslE;?ov+Zmo zaq~~h`gtdqPV^KNs#U{}$%m37RS6{v3>UAjd1f3TgRtzI;vrWiZ&!A@)#4+aT~A2s zp05QpA&fTrpoT)}g)&T0J?)@onY8FO)zi|5(3N*`vq%F&K!i{Pald7Gl%W|`H?ziJ zJaElpt5EBqQLq=XSG@Oh=Ze+3kW$YTm#BGqwDtutw;@CP@d>GS8&6c}N^5qUL#=AN z@VE$XZFcchYK>CUFv>=fEX_<=*&2kjTYbtmCH052y%cf3a$JO5&>D%m5G}RaHym)7 zM5i(?W*JI0^|@heYV4jTogmF}p!r(<`&0&dkv`?gB(nV>*O$2?5}FsW`9IL}n9;{( zP1G@H!fvv(1MZ}Yv5 zh^lvrlUWxaDAGUaGOpp7P&5u5!F{3N6E>m#^gnG>#$VLrFkcNY1zX~2Hx*SN4Ws2< zB-Jg()s=f@5R|w&fYSuu$<9vJ7D{$wZfUev981SEjv_Ke+O3$4AOM4(9{Qm7X6*^% zio$y8lI306miTv;(~I9iW+EEnmP4_o^|dV5BcBXX*Uoh#QsJ#H9X=H#9jLN`XfFFG z>~J#gALS`$@*n3Zheh1+8o5cA)yqs@ryGy>^ozyd9&yWh%b7mmoTTx1YPWO1kP&n{ zk#6y{Q7HYrUiTP;2n5sP21fZ?(4RZB~2k6gGrVWY$WfbXO2ab)^E> zz$y~ScG3$0KwsI}Xv;ks+p&laxBF6=#C6QVG-J`u>7WIjn~6`YlRCa5CIXUN;KWUI zVmS%P6*cf@8e3tAePr?`(g@1Jk&+MdY{uQE7RXN(z@0cy*TVefUEgf80x6DM(Lr{s zngq>j!1FeD6Z3L}Br`K|4ZI*XHr!b$?=T5&cS_L0caAMP%|h`>i8p{Ow9nGIeiWvb z+dh~z>D4@ms}LURzI(a(U-iZNJ%&ER()^POE^nsN!!ZmHW^WOo+?^t@sE5_Msd>IS zv+5cFrp5^bLo;iMVd6Z0svlN#Xl>nnb#=oP7{tQ`t!%!7*3{3UiXxs*LEs*6e|1b7 z7Z75k*v*C0v5eR*-Pf!Ly@k1Y;hJCvY~KJXTU~nunB~*X7sv!CzLA7tuTnZIbBO!G z^tVmVzD@Q~mX<^gCz0f`0n<~n$1Qr71Y+LtCJI%!WZC48D?rfWpipS zc9s8{ZP4qsRR1fj*&8{^31K1t%c!nbpdS*N#qLpZjI9NNS&OXJeGFtDabnn`HFGlv zx)n4)zwfiFTVM%AhC&1~Zxh%XN=iUdQWlDbk3=ybITMm!doNs3xaqTT@Om=iY1GJG z@Td`MsHx|Y^nM644ah*3cjW+wOFov)6xa}A2+=v9n-}e)$B3yUoPl&4Ay@(;OaM>;|Tu&u%Ar7ALKB2#$H&XTC%4I0oYl+ z_jM8hEu{6rQv?hEXkkH*c4({j26+*HS=CgdkAR5rUtjcvLZ6I@LP}E~lT{+Ts*3=n z{-9m*2IypK+cL#Hw*F#|OWi)@tI|dhX=1%%N|eFWsx1G?AI3QbD{+vG1!H`#nT&k3t1aOLZOJ|MJekHRiL4WK_wk zCGpDWXVoxs?L@R*F@p42MDb&6rt8SvJo@zJJ7QqxXbHDnntiL7#S>1&6e!||AiuQ> zIxT89>5UE{VexbPf=pC-f{xiKY=dzx;Mnnk5ruiw22n^GZ*ap2KdV~co1})U6kPC+ z%t%4f*iwHy!FZgBH+ABQl|(b+Vx>aL_T6I=m(L8umJ+H2 z*kk?O@R6PB1dT=p16^);KjeE6zm4av*#;=lN^sE318aO5VH~&yg?+ zl#@z(xkH!g6S zg2r<81TFZi;oZpI<+T@4cSetj!gk7P+KV*86_rB~73)gTlr(=8lYr%_z}UMdt+M%v z24{Xti49+xbw`YrER>zFzQo3{n=n%AJvEYTDJm4B;JUGdbPz7f8Kg&&r2EMYSOV|G z<78Xqh;^aJXtm&$^GRY-!_?)~@4cliB2#s388UT`^%oh!#lOq%e(AQ|!Mc6BA}jyN zWnzxSnRsAs@uQ`@0C}*{)$>e0HU6@`@FhF?#`z@0J8Om5V%J_2d#q3?Ri9;aQ+KU^ z?Ig;>)nM=~4%2uDK0l1 zM-rJiv2=^o;|S*b8>=)$Q}i06@V1(h9L634W#>LZ&NG?ey>f+9@V!#*$|O( z9f|!6U*sAeWspx|M{Qf}a7s&s^2I36C00a9*_52!a>bwuDwDbBdvax^Z66b{TdY53 ztp*K4$3#=S+Kd=Q000L57%J;jF9>d^$1~(Wv}2X4n^U+Amy-OpVUf9g1Rzp1)3--J zv~|~M9~OA4CX@#j)NY9o5{n}dj0RGIUgeEF^-E2{o2q=Wpf>xWsG|0X%184V6%2y~ z<*CmfXDcfzMudMYEs}q%S75@C{)EYeaU z(}DTLQFrAwt6tg~yOA~cY0~bxfBmH1X`sZWqK1j^4@? zXJy)qg>U;>zPEUfc(mz$5Kcby*22wy!x*nt3T)R)loEDWd$JTnkG42F0g)Pi1+;Z7 zVs12c*`s;GGV_VVQ`-3Bh_ydSx$$bhF3p?QZXX)rgOVP-f+U)9aO6FC+t&7>kS#Ls zdnPd-SyZx*#T!vnL-KZrtLEY|o4JMTD98?pGRXE#hW|@CvZ!NE?&XT_0}+C@C!433 zdmRQiV$GAEiaT5L@r6Zdu~wrKx=TJYj~oz~l3$Qq@wcYS49!KFUg}@;mM_&npCrk$ zwLUsAeZ$e{KgO~4RLirx{=+P>2_;boxP>6Kg<-HgV}^9wM0Vf?f@K{or*7jClE8pB zcTIED8G-xk)yq=iu5d-RqZ#61HFbqsB`FhJQFs4|g9Dbj^lH87~rfcgIDl1EfG<2t7P|kFvk&%i~mnh`SOQe zqR;*(0u*`Qe|}Z zSShb;g@{MK$arMpSXn2pF{kSA8V0_h;}fnDg42w9 zDl4DkY&ArFPK+ZgQv9KBo03Z0avI%<9w{w%%fKJmTm52r0cKMD+q zzH3&9>w~+Qoo+j6)z$90q+A-VkO)XOo=a)<9==-?~}b6uV0Q}UFNg6L-V#Z;QZt`t`vi>t<` z{AMoiVPE6Umv%oRxwi9fh;T{FO++F?BuNX>mDExVlxy`a5_+*&agA`>7gGor{JSMK z7L$bZZ46?>8m)eu$EV#uY48ZaE|$R2>Ter+4~tCSHYE@|I(FU%-P;j{fY0>eitsJW zpuy}5GXA!BlXJ+%^ddys$cfn$UJ;1rwew%*7PLqyZ7b3QY8k1js?4qL(c0g?L>NIXJ7l#I_2Ug1 ziIBL$ZJrGeCE(baFKD%7LxhWl6=cyb>|P$Hp<2-Sjkl8bF_8Szp*38t5MQNx zr$!|+5%zUg6?AoJp`kFqeTi0oaY%1;7Pks(N8yqI>~pka4O^5$eSX&91(G5435Yg^ z_@yZUeJHV@HQRI=DRzj}9q57h)h5qO2{CC9$Qx|T91YbweNP5S(an#>`aZ#9Sf{Q2w)G-BmswYi+aGWnkF8963@6RPBA67{IYXE* zQ*yg5p0P+aW_?FWWRRd&V=B!arER21lf$0pqLXj5%7Ycjr9x1&Mk_35?RXX^ZyBi;hdff;HKMLeIVs=2QxmgN+eWxUSBPeY|Ndm|Wt@gG|Dnd^ymT^7}+Lk;Br7 zUP(4dbWjXFGJQ-Uyb80?%98=H(50e%Y6CHAwJtFcOu1k&84N!^O8Ybf#TjzOZlO7D z$?+I>8iAt|2$tA}X=7$I7;9caeoUer5hGo#*Ab+q!N(;8pkTzvokM-7Uj&(|TKoiO z=2{uM0~F?ub;vlgLpy$7@DdSoeT=ev zIYd)=I^0~5T}9zecD>oDG5-| z%H#};vBM`3&olo~SQ!YXKQjI#KHYXN@mMEAL{*C-OGGB%Mm8Y-naha0Ar;<-Fh)?& zuDqwZ|72msZqQYBz7y)by*U9y^=;ScJ8$77leNxJo%1mKcOjYb11)S8 z{R{8a8QVW94{98W@IuN^Lvd3!S{&VcRGqHUaTf=_(kkNH=$D-|KR>}c<>u5%1YFG( zd6;d971r3Y%jYnjkhtl-15iT>{%aq0GB9Um5aCCpDe^2 z+@GtJ?2hT<``zekOVvm6t8RkQFc28g7+2Z^>sxkkUafnqymDSXYq7$Mrh9j;Y$!Lahl^__ZPS1el=6JlNg5L%75HrJNz6D}=ewj6%+Xls)Pc> zS38uEZn+|fb37J}eE9QVR4N+swg$f}r?rB7FESa}tXUe@8r$SN=7?Y!D<9tzq|INA zAJh_>L=E{+Ao>bLhGf&|rbz}AN_)>yDp!B$MXeE!2d|T+|eY}#?|1vK@&YID$y!yI1K^{wkT%1i3 zh={7Vvm^`!0}opZ9}U*vqP+>O<98;R=lRMm3dw$JfEZ&!g3J#MkM{OLHzE$+SkpSm zC+f$f)qXLUz{u|$kx~g#>#gQwvk*$#^`C-KRmR}%)ev6F5=3`km)o@IKUMD{ zEigJhK+;!`CRNH3wG(p^jxjSrE4RpsZ@fUitm_XA^D}*2uv|9iWnx6miu}4hP0Ky< zD`YDRyNXaT^Rat3q9KN``nH#8UGp%KWukmdLf(s9V$=Lwjk-~7nX zEk6cMZxSeo0!7D~`i!A*ocpqY6-6`hyO5l$dXJQi(*0jvQ%#=Q-)AlNA zb~R5pt3C2{K1cuSX!W0bE;JS$vHlY!P#pnvj)Ovi6`sC>)aTO!X@C&rn0YRoR-IkQ zCnuvW9d+VI724FFvs~g(nk@w>JBrO-)hWX6u2jfTa-)jvr|25Fcn>VZJTnF*s0`6% zuvS|5JmXJAz6JRWN5y&y$_vch{4|sDUeSAN!KV~Ycd_B$3VE(Gtov3nfH6txTD}Uq zGkRij%ZsVufVvcSj#LM7=vTgw_qsVjcu?uC3_vmNTQ91x%I`-+{nIv`tB5BWd({Yv z28EqnZvC+0rpkFlpnU}R!CWODvg4QUn)I6CZ9*StHd9b4(`_fhv8%fC5J8z0`c$vP zd>BEYH<9OEZ>k-2!654i#bUo4g_WoBv(64P|FP6BS91{rE6&J}OzU~j1mQdHt%h%2 z)6EBTTWb@wEJm+yIh0iyZf!w##+f|ZQfR=dAk&7`iA|^C+^CMZ+`Tl`q--bKfrRJ& z9Ka@kp<7S5V(6eW2^BSVFD@s<*eDY3IM|EnEQ22TC;bdfkyQe|orTX^TYHy7^L5G5 z8Z6n96fe608nR~)5GjOSyHTb7dZy9K;VZ=^T`~sR4OukPLD7EX_A{C>djMS)ULlI3H{Ahwpqj>Ux5zE9bM6tAIs(QS?ni)6p<9m&kr zVUpbZ!JAiM5_UfES0&4{gM*HrW)6C~Gx zk0zxAn_z@UuC_ne>2=8R)#GdG?r$fx7pkgSzd0`ZH0t9Goy+|EAwl-Cm;`s^ITn*4 zT2U2AYXSN%T;X1x$GV0rVPimyl*hl`;Z`tl^0(|%f$ScW6mT<3dl2SC)e`p19%2#< zx?^UgtTjy{RzsAFdG)#PhIl&s4^$n2iKwq1*$3P6lZ?qTUu2fni5!3f%)Vv;EHD`; zJ1wUJI0lD8%AF*M#wl4E-kUBls*o-T&?I`e!Ea% z!nm-d+!akSzFkwYZbF^*J^HjEuI-rH(^G|*3H8SK$5j^Dg|!3|>dxnTo2`~zarB4@ z!2Kgs$3S@n1{bls^~0`N^mzNVJxJmW{QAX1&RtCr2x15Pe=cMY0$`|2KsBHcOpggj zN%nU}9vc9c{^!RQ24wRlucNlVg)ge5635=O@ilmfEDUO$k1SkVI+g#CCR z?_iuPa54&Wf)h}a2y{$@7&gQLWC0aOL))Z@VK}Tn7T`EcloifK(1JnW6bONJu>z%m zlQ1MUIN^gSJdjmb^aH_%jXw}N7!f<1?8EdP$S^DePC%&nQ0jaV*fl#4hwHz|QviVI zpQ8Z8d;$R8zIEYrwzW35aQ;JhxL|PtKmu4SFOU=@TK9W^@HjsoNVxuYdEucf*Z{-j z1S*3B8XxE*m_{s@nct{3df%uyL)W8!0q<<9hw)|E?#08hr8( ze*gkE9B{V(0U8g0qvJP#eriU8m2ktSh#l7XpzrX3$<_te_Xx-ZJK_fNf>^u%w6ov> zl9K(BkAC7q4SR546nsD&@I&w% z#?1#L0==Gqs$by4eMKCYEu8Zwb`JCB0}_IkXZ~WL!|LD|{1C{4jXX5UTlmePp2C5l z@x#?U#PML1{BTaq^51P<@B<0S{~N~p-!5%!{4JUDAo&o#ID+q9Z{P#?cjwi%|CT&{ zkbF4CkHGyBSG@m~^xOMeQc?ge`Eb5(g-eG1Ka$ahe@n&+069V7XRuBI;8XH{dC~uz zLBP)WUo9}84u^;^aX}ys`GX^w5BIrY@LieqU((>~|475`MSzH~7(uv|?cTvFIbc`9 z@bck3yi5=ExP7tvDTu(|q(L;8p9oMFVI2K;E&W43`4HwXextuS zxq=Cc6$R>ozGK05MS&6^Y9bh$7~HncXkdpz?YO<4!AJj{{Wd}62Jfe delta 8525 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 header and are part of the C++11 standard. +This next part is *completely optional*. However, since we're on the topic of memory management and best practices, I felt it was worth discussing smart pointers. + +Smart pointers are wrappers around raw pointers that provide automatic memory management. They are defined in the `` header and are part of the C++11 standard. C++ offers two main types of smart pointers: `std::shared_ptr` and `std::unique_ptr`. From 4bc8b3d4c02867b43d836d563962a40ca88ce7b3 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:02:32 -0500 Subject: [PATCH 6/9] Add lesson on containers --- cpp-review/classes/lesson.md | 2 +- cpp-review/containers/lesson.md | 557 ++++++++++++++++++++++++++++++++ 2 files changed, 558 insertions(+), 1 deletion(-) create mode 100644 cpp-review/containers/lesson.md diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md index 81b3d5d..501e79f 100644 --- a/cpp-review/classes/lesson.md +++ b/cpp-review/classes/lesson.md @@ -208,7 +208,7 @@ player.is_alive(); // OK It is good practice to mark member functions as `const` if they do not modify the object's state. -On rare occassions, you will want to create a member function that returns a reference to a member variable for the caller to access and possibly modify. In these cases, you may need both a `const` and non-`const` version of the function. This is the case for many STL containers, like `std::vector`. +On rare occasions, you will want to create a member function that returns a reference to a member variable for the caller to access and possibly modify. In these cases, you may need both a `const` and non-`const` version of the function. This is the case for many STL containers, like `std::vector`. # Copy Constructors and Copy Assignment Operators diff --git a/cpp-review/containers/lesson.md b/cpp-review/containers/lesson.md new file mode 100644 index 0000000..8826003 --- /dev/null +++ b/cpp-review/containers/lesson.md @@ -0,0 +1,557 @@ +# C++ Containers + +**Author:** *Brian Magnuson* + +In this lesson, we will be discussing C++'s containers library, one of the most important parts of the C++ standard library. + +Occasionally, I may refer the containers library as the **Standard Template Library (STL)**. STL actually includes containers, algorithms, and iterators. In this lesson, we will be discussing both containers and iterators. + +There are quite a few containers available in C++. Many of them use similar interfaces. So for this lesson, we will be start by covering `std::vector`, the most commonly used container in C++, in detail. Then we will discuss the other containers. + +In this lesson, we will cover the following topics: +- Vectors +- Iterators +- Linked Lists +- Stacks, Queues, and Double-Ended Queues +- Priority Queues +- Sets +- Maps + +We will not be covering `std::array` in this lesson. `std::array` is a fixed-size array that is a wrapper around a C-style array. You can read more about `std::array` [here](https://en.cppreference.com/w/cpp/container/array). + +And one more thing: The purpose of this lesson is to teach you how to use these containers, not to teach you to implement them or the theory behind them. If I were to talk about that, this single lesson would turn into a full-size course on data structures and algorithms. We'll discuss these topics in later lessons. + +# Vectors + +An `std::vector` is C++'s dynamic array class and is defined in the `` header. A **dynamic array** is an array that can grow and shrink in size. + +In actuality, dynamic arrays have a fixed capacity. When the array size reaches capacity, a new array of a larger capacity is allocated, and the elements are copied over. Usually, the old capacity is multiplied by some constant factor to get the new capacity, so this operation occurs less frequently as more elements are added. + +An `std::vector` can be initialized in a number of ways. Here are a few examples: +```cpp +// Create an empty vector +std::vector vec1; + +// Create a vector with 10 elements, all initialized to 0 (or default constructed) +std::vector vec2(10); + +// Create a vector with 10 elements, all initialized to 5 +std::vector vec3(10, 5); + +// Create a vector using an initializer list +std::vector vec4 = {1, 2, 3, 4, 5}; + +// Copy a vector +std::vector vec5(vec4); + +// Copy a vector using an iterator +std::vector vec6(vec4.begin(), vec4.end()); +``` + +## Empty, Size, and Clear + +I bring special attention to the `empty()`, `size()`, and `clear()` functions as almost all containers have these functions. + +- `empty()` returns `true` if the container is empty and `false` otherwise. +- `size()` returns the number of elements in the container. Usually a `size_t`, which is compatible with `unsigned int` (though GCC probably won't get mad if you use `int`). +- `clear()` removes all elements from the container. + +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec.empty(); // false +vec.size(); // 5 +vec.clear(); +vec.empty(); // true +vec.size(); // 0 +``` + +## Accessing Elements + +Vector elements can be accessed using the `[]` operator (sometimes called the subscript operator) or the `at()` function. The difference between the two is that `[]` does not do bounds checking, while `at()` does. If you try to access an element that is out of bounds using `at()`, an `std::out_of_range` exception will be thrown. + +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec[0]; // 1 +vec.at(0); // 1 +vec[5]; // Undefined behavior +vec.at(5); // Throws an exception +``` + +Unlike with maps, you cannot use the `[]` operator to insert elements into a vector. + +Both `[]` and `at()` return a reference to the element, so you can use them on the left side of an assignment statement to modify the element. Both have const and non-const versions, so you are free to use them with `const` variables. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec[0] = 10; +vec.at(1) = 20; +``` + +You can use these functions in combination with the `size()` function to iterate over the elements of a vector. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +for (size_t i = 0; i < vec.size(); i++) { + std::cout << vec[i] << " "; +} +``` + +This is the most basic way to iterate over a vector, but there are other ways which we will discuss later. + +Vectors allow you to access the front and back elements using the `front()` and `back()` functions, respectively. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec.front(); // 1 +vec.back(); // 5 +``` + +## Inserting and Removing Elements + +With vectors, you can insert and remove elements at the end of the vector using the `push_back()` and `pop_back()` functions, respectively. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +vec.back(); // 5 +vec.push_back(6); +vec.back(); // 6 +vec.pop_back(); +vec.back(); // 5 +``` + +As mentioned, when the vector reaches capacity, a new array is allocated and the elements are copied over. Because of this, the worst-case time complexity of `push_back()` linear in container size. However, the amortized time complexity is constant and we generally treat it as such. + +If you happen to know how much space you will need, you should make sure to initialize the vector with the size you need to avoid unnecessary reallocations. + +## Comparing Vectors + +Vectors can be compared using the `==` and `!=` operators. The comparison is done element-wise. +```cpp +std::vector vec1 = {1, 2, 3, 4, 5}; +std::vector vec2 = {1, 2, 3, 4, 5}; + +vec1 == vec2; // true +vec1 != vec2; // false +``` + +Since each element is compared, the worst-case time complexity of comparing two vectors is linear in the size of the vectors. + +# Iterators + +Most containers have a public inner class called an **iterator**. An iterator is an object that allows you to traverse the elements of a container. Iterators are similar to pointers in that they can be dereferenced and incremented. For a vector, it is something like `std::vector::iterator`, where `T` is the type of the elements in the vector. + +There are a few different types of iterators: +- Forward Iterators allow you to only move forward through the container. + - You can use the `++` operator to move to the next element. +- Bidirectional Iterators allow you to move forward and backward through the container. + - They include all the functionality of Forward Iterators. + - You can also use the `--` operator to move to the previous element. +- Random Access Iterators allow you access any element in the container in constant time. + - They include all the functionality of Bidirectional Iterators. + - You can also use the `+`, `-`, `+=`, and `-=` operators to move to any element in the container. + +Vectors have random access iterators, so you can use the `+`, `-`, `+=`, and `-=` operators to move to any element in the vector. Not all containers have random access iterators, so you should be careful when using these operators. + +To demonstrate iterators, we'll loop through the elements of a vector using them: +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +for (auto it = vec.begin(); it != vec.end(); it++) { + std::cout << *it << " "; +} +``` + +Most containers have a `begin()` and `end()` function. +The `begin()` function returns an iterator to the first element, and the `end()` function returns an iterator to *one past the last element* of the container. Dereferencing the iterator returned by `end()` is undefined behavior. + +Here, we initialize `it` to the iterator returned by `begin()`. We use the `auto` keyword since writing the type of the iterator can be quite verbose. We then loop through the elements of the vector, dereferencing the iterator to get the element. + +If all we need is to iterate through the elements in order, we can use a range-based for loop. This is a more concise way to iterate through the elements of a container. +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +for (int i : vec) { + std::cout << i << " "; +} +for (int& i : vec) { // Same as above, but we use a reference instead of a copy + i++; +} +``` + +A range-based for loop uses iterators under the hood and automatically dereferences the iterator for you. Theoretically, you can write your own container class and use a range-based for loop with it, as long as you provide the `begin()` and `end()` functions. + +There are other functions that make use of iterators. + +- `insert()` allows you to insert elements at a specific position in the container. + - For vectors, the elements after the position need to be shifted over, so the time complexity of this operation is linear in container size. +- `erase()` allows you to remove elements at a specific position in the container. + - Similar to `insert()`, the elements after the position need to be shifted over. + +```cpp +std::vector vec = {1, 2, 3, 4, 5}; +auto it = vec.begin() + 2; +vec.insert(it, 10); // {1, 2, 10, 3, 4, 5} +vec.erase(it); // {1, 2, 3, 4, 5} +``` + +There are also functions defined in the `` header that make use of iterators. +- `std::sort()` sorts the elements of a container. + - The time complexity of this operation is `O(n log n)`, where `n` is the size of the container. + - This function's implementation usually combines multiple sorting algorithms to be as efficient as possible. +- `std::find()` searches for an element in a container. + - The time complexity of this operation is linear in the size of the container. + +```cpp +std::vector vec = {5, 3, 1, 4, 2}; +std::sort(vec.begin(), vec.end()); // {1, 2, 3, 4, 5} +std::find(vec.begin(), vec.end(), 3); // Returns an iterator to the element 3 +``` + +And that's about everything you need to know about vectors and iterators. We'll continue by covering the other containers and how they are different from vectors. + +# Linked Lists + +A linked list is a data structure that consists of nodes. Each node contains a value and a pointer to the next node in the list. The last node in the list points to `nullptr`. + +C++ provides two classes that implement linked lists: `std::forward_list` and `std::list`. They are single and doubly linked lists, respectively and are defined in the `` and `` headers. + +`std::list` is similar to an `std::vector`, but with the following differences: + +- `list::insert()` and `list::erase()` have constant time complexity. + - This is because the pointers in the nodes are updated, rather than shifting elements over. + - However, you still need the iterator to the element you want to insert or erase, and arriving at that element can still take linear time. +- `list` provides some additional functions for adding elements: + - `list::push_front()` and `list::pop_front()` add and remove elements from the front of the list. + - These functions have constant time complexity. +- `list` only provides a bidirectional iterator, so you can't use the `+`, `-`, `+=`, and `-=` operators to move to any element in the list. +- `list` does not have `operator[]` or `at()` to access elements by index. + +```cpp +std::list list = {1, 2, 3, 4, 5}; +auto it = list.begin(); +list.insert(it, 10); // {10, 1, 2, 3, 4, 5} +list.erase(it); // {1, 2, 3, 4, 5} +list.push_front(10); // {10, 1, 2, 3, 4, 5} +list.pop_front(); // {1, 2, 3, 4, 5} +``` + +`std::forward_list` is similar to `std::list`, but with the following differences: + +- `forward_list` is a singly linked list, so it only has a forward iterator. + - It still has an `end()` function, but since it is a forward iterator, you can't use it to iterate backwards. +- `forward_list` does not have a `size()` function (crazy, right?). +- `forward_list` does not have a `push_back()`, `pop_back()`, or `back()` function. + +`std::list` and `std::forward_list` are not very commonly used, but they still offer a few advantages over vectors in certain situations. For one, they make splitting and merging lists easier. They also have constant time complexity for inserting and erasing elements at any position. + +# Stacks, Queues, and Double-Ended Queues + +A **stack** is a data structure that allows you to add and remove elements from the top. This is known as a **last-in, first-out (LIFO)** data structure. + +C++ provides the `std::stack` class that implements a stack and is defined in the `` header. You'll find that it actually provides very few functions. Mainly just these: +- `push()` adds an element to the top of the stack. +- `pop()` removes the element at the top of the stack. +- `top()` returns a reference to the element at the top of the stack. +- `empty()` returns `true` if the stack is empty and `false` otherwise. +- `size()` returns the number of elements in the stack. + +Note that some other programming languages use `pop()` to also return the element at the top of the stack. C++ does not do this. You need to use `top()` to get the element at the top of the stack. + +```cpp +std::stack stack; +stack.push(1); +stack.push(2); +stack.push(3); +stack.top(); // 3 +stack.pop(); +stack.top(); // 2 +``` + +Stacks do not provide iterators, so you can't iterate through the elements of a stack. You can only access the top element. + +An `std::stack` is an example of a wrapper container. It uses another container to operate. The container is required to implement the `push_back()`, `pop_back()`, and `back()` functions. By default, `std::stack` uses an `std::deque` as the underlying container, but an `std::vector` or `std::list` can also be used. + +So if you were thinking you could use an `std::vector` as a stack, you'd be totally right. The main difference is that `std::stack` provides a more limited interface than `std::vector`. This can be a good thing, though, as it indicates to the programmer that the container should only be used as a stack. + +A **queue** is a data structure that allows you to add elements to the back and remove elements from the front. This is known as a **first-in, first-out (FIFO)** data structure. + +C++ provides the `std::queue` class that implements a queue and is defined in the `` header. + +It is similar to a stack in that it provides very few functions. Mainly just these: +- `push()` adds an element to the back of the queue. +- `pop()` removes the element at the front of the queue. +- `front()` returns a reference to the element at the front of the queue. +- `back()` returns a reference to the element at the back of the queue. +- `empty()` returns `true` if the queue is empty and `false` otherwise. +- `size()` returns the number of elements in the queue. + +```cpp +std::queue queue; +queue.push(1); +queue.push(2); +queue.push(3); +queue.front(); // 1 +queue.back(); // 3 +queue.pop(); +queue.front(); // 2 +``` + +Like `std::stack`, `std::queue` is not iterable and is a wrapper for another container. The container needs to implement the `push_back()`, `pop_front()`, `front()`, and `back()` functions, so an `std::deque` is suitable. + +A **double-ended queue** (deque) is a data structure that allows you to add and remove elements from both the front and back. It effectively combines the functionality of a stack and a queue. + +Double-ended queues are typically implemented as a circular array (an array with two pointers to keep track of the front and back) or a doubly linked list. + +C++ provides the `std::deque` class that implements a double-ended queue. It is similar to a vector and provides many of the same functions with the addition of: +- `push_front()` adds an element to the front of the deque. +- `pop_front()` removes the element at the front of the deque. + +`std::deque` also provides an iterator. If you need an iterable queue, an `std::deque` is a good choice. + +```cpp +std::deque deque; +deque.push_front(1); +deque.push_front(2); +deque.push_back(3); +deque.push_back(4); +deque.front(); // 2 +deque.back(); // 4 +deque.pop_front(); +deque.pop_back(); +deque.front(); // 1 +deque.back(); // 3 +``` + +An `std::deque` can even be initialized like a vector: +```cpp +std::deque deque = {1, 2, 3, 4, 5}; +for (int i : deque) { + std::cout << i << " "; +} +``` + +# Priority Queues + +A **priority queue** is a data structure that allows you to add elements with a priority and remove the element with the highest priority. + +Priority queues are typically implemented as a binary heap, a data structure that is a complete binary tree where each node is greater than or equal to its children. Most operations on a binary max heap are logarithmic in the number of elements. + +C++ provides the `std::priority_queue` class that implements a priority queue and is defined in the `` header. Like `std::stack` and `std::queue`, it is a wrapper for another container. The container needs to implement the `push_back()`, `pop_back()`, and `back()` functions, so an `std::vector` is suitable. + +`std::priority_queue` provides the following functions: +- `push()` adds an element to the priority queue. +- `pop()` removes the element with the highest priority. +- `top()` returns a reference to the element with the highest priority. +- `empty()` returns `true` if the priority queue is empty and `false` otherwise. +- `size()` returns the number of elements in the priority queue. + +```cpp +std::priority_queue pq; +pq.push(3); +pq.push(1); +pq.push(2); +pq.top(); // 3 +pq.pop(); +pq.top(); // 2 +``` + +Here, even though `1` was pushed before `2`, `2` has a higher priority because it is larger. + +By default, `std::priority_queue` is a max heap. But we can customize it by providing more template arguments. The second argument is the container to use, and the third argument is a comparison functor class. +```cpp +std::priority_queue, std::greater> pq; +pq.push(3); +pq.push(1); +pq.push(2); +pq.top(); // 1 +``` + +By default, `std::priority_queue` uses `std::less` as the comparison functor, which (confusingly) creates a max heap. If you want a min heap, you should use `std::greater`. + +If you're not familiar, a **functor** or **function object** is an instance of a class that overloads the `()` operator. It is used to provide a custom comparison function to the priority queue. + +The implementation of `std::less` is very simple. Usually something like this: +```cpp +template +struct less { + bool operator()(const T& lhs, const T& rhs) const { + return lhs < rhs; + } +}; +``` + +You can imagine `std::greater` is similar, but with the comparison operator flipped. + +Because C++ lambda functions are functors under the hood, you can use them in place of a functor class. +```cpp +auto cmp = [](int lhs, int rhs) { return lhs > rhs; }; +std::priority_queue, decltype(cmp)> pq(cmp); +``` + +This also makes it possible to use a priority queue with more complex objects. Suppose we wanted to use 2D points and compare them by their distance from the origin. +```cpp +struct ComparePoints { + bool operator()(const std::pair& lhs, const std::pair& rhs) const { + return lhs.first * lhs.first + lhs.second * lhs.second < rhs.first * rhs.first + rhs.second * rhs.second; + } +}; + +std::priority_queue, std::vector>, ComparePoints> pq; +``` + +In this priority queue, we use the `<` operator to compare the distances of the points from the origin. This means we are creating a max heap, and the first element in the priority queue will be the point farthest from the origin. + +# Sets + +A **set** is a data structure that stores unique elements. It is implemented using either a binary search tree or a hash table. + +C++ provides two classes that implement sets: `std::set` and `std::unordered_set`, defined in the `` and `` headers, respectively. +They are implemented using a binary search tree and a hash table, respectively. + +- `std::set` + - Elements are stored in sorted order. + - Most operations have a time complexity of `O(log n)`. + - The keys must be comparable. + - If the keys are not normally comparable, you can provide a comparison functor. +- `std::unordered_set` + - Elements are stored in an arbitrary order. + - Most operations have an amortized time complexity of `O(1)`. + - The keys must be hashable. + - If the keys are not normally hashable, you can provide a hash function. + +Both sets provide the following functions: +- `insert()` adds an element to the set. +- `erase()` removes an element from the set. +- `find()` searches for an element in the set. + - Returns an iterator to the element if found, otherwise returns `end()`. + - Note: this is different from `std::find()`; this function uses a more efficient search algorithm. +- `empty()` returns `true` if the set is empty and `false` otherwise. +- `size()` returns the number of elements in the set. +- `count()` returns the number of elements in the set that are equal to a given value. + - This function is useful for checking if an element is in the set. + - Since sets only store unique elements, the return value will be `0` or `1`. + +```cpp +std::set set; +set.insert(1); +set.insert(2); +set.insert(2); // 2 will not be inserted again +set.size(); // 2 +set.erase(1); +set.size(); // 1 + +set.find(2); // Returns an iterator to 2 +set.find(3); // Returns set.end() +set.count(2); // 1 +set.count(3); // 0 +``` + +Both `std::set` and `std::unordered_set` provide iterators. The iterators are bidirectional for `std::set` and forward for `std::unordered_set`. + +```cpp +std::set set = {1, 2, 3, 4, 5}; +for (auto it = set.begin(); it != set.end(); it++) { + std::cout << *it << " "; +} +``` + +By default, `std::set` uses `std::less` as the comparison functor, which compares elements using the `<` operator. If you want to use a custom comparison function, you can provide a comparison functor as a template argument. This is useful for custom objects. We'll use the same `ComparePoints` functor from the priority queue example. +```cpp +std::set, ComparePoints> set; +set.insert({1, 2}); +set.insert({3, 4}); +``` + +For `std::unordered_set`, the default hash functor class is `std::hash`. You can provide a custom hash function if the keys are not normally hashable. The rules for creating a hash function are a little complicated, so we won't go too deep into it. They go something like this: +- The return type is a `size_t` (an unsigned integer type). +- The function should be deterministic (return the same value for the same input). +- The function should be fast to compute. +- The function should distribute the hash values evenly. + +You'll learn more about hash functions in a later lesson. + +There is also a `std::multiset` and `std::unordered_multiset` that allow duplicate elements. +They are also defined in the `` and `` headers, respectively. The `insert()` function will always insert the element, and the `count()` function will return the number of elements equal to a given value. + +# Maps + +A **map** is a data structure that stores key-value pairs. Similar to sets, maps are implemented using either a binary search tree or a hash table. + +C++ provides two classes that implement maps: `std::map` and `std::unordered_map`, defined in the `` and `` headers, respectively. + +- `std::map` + - Elements are stored in sorted order by key. + - Most operations have a time complexity of `O(log n)`. + - The keys must be comparable. + - If the keys are not normally comparable, you can provide a comparison functor. +- `std::unordered_map` + - Elements are stored in an arbitrary order. + - Most operations have an amortized time complexity of `O(1)`. + - The keys must be hashable. + - If the keys are not normally hashable, you can provide a hash function. + +Though maps can be default constructed, they can also be initialized using a list of pairs. Each pair represents a key-value pair. +```cpp +std::map map = {{1, "one"}, {2, "two"}, {3, "three"}}; +``` + +Maps do things a bit differently than sets, so we'll go over the functions they provide. + +## Inserting elements + +A typical way to insert elements into a map is to use the `insert()` function with an initializer list for a pair. +```cpp +std::map map; +map.insert({1, "one"}); +``` + +You can also use `emplace()`, which constructs the element in place and returns a pair containing an iterator to the element and a boolean indicating if the element was successfully inserted. +```cpp +map.emplace(2, "two"); +``` + +## Accessing elements + +You can access elements in a map using the `[]` operator or the `at()` function. + +The `[]` operator will locate the element with the given key and return a reference to the value. If the key does not exist, a new element will be created with the default value for the value type. +```cpp +std::map map = {{1, "one"}, {2, "two"}, {3, "three"}}; +map[1]; // "one" +map[4]; // "" +``` + +The `at()` function will locate the element with the given key and return a reference to the value. If the key does not exist, an `std::out_of_range` exception will be thrown. +```cpp +map.at(1); // "one" +map.at(5); // Throws an exception +``` + +Be careful about using the `[]` operator to access elements in a map. You might accidentally insert a new element if you aren't careful. + +## Iterating over elements + +Maps provide iterators that allow you to iterate over the elements. The iterators are bidirectional for `std::map` and forward for `std::unordered_map`. +However, they are slightly different from the other iterators we've seen. Iterators for maps are iterators to pairs of keys and values. + +```cpp +std::map map = {{1, "one"}, {2, "two"}, {3, "three"}}; +for (auto it = map.begin(); it != map.end(); it++) { + std::cout << it->first << ": " << it->second << " "; +} +for (auto pair : map) { + std::cout << pair.first << ": " << pair.second << " "; +} +for (auto& [key, value] : map) { + std::cout << key << ": " << value << " "; +} +``` + +The first loop is the most basic way to iterate over a map. The second loop uses a range-based for loop, which is more concise. The third loop uses structured bindings, which allows you to unpack the pair into separate variables (structured bindings were introduced in C++17). + +## Other map functions + +The rest of the functions provided by maps are similar to those provided by sets. + +- `erase()` removes an element from the map. +- `find()` searches for an element in the map. +- `empty()` returns `true` if the map is empty and `false` otherwise. +- `size()` returns the number of elements in the map. + +# Conclusion + +And that's it for this lesson on C++ containers! In this lesson, we've only covered how to use these containers. We haven't discussed how they are implemented or the theory behind them. We'll discuss these topics in later lessons. From d112d0cccbb7f5a3762a800a3db3ce36cdf76ece Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Mon, 25 Nov 2024 20:50:14 -0500 Subject: [PATCH 7/9] Add practice problems to classes lesson --- cpp-review/basics/lesson.md | 2 +- cpp-review/classes/lesson.md | 124 +++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/cpp-review/basics/lesson.md b/cpp-review/basics/lesson.md index 261f90a..a1acfd3 100644 --- a/cpp-review/basics/lesson.md +++ b/cpp-review/basics/lesson.md @@ -374,7 +374,7 @@ void ping(int n) {...} void pong(int n) {...} ``` -This is the ***recommended way*** to structure your C++ code. An exception to this rule is when you are using templates, which we will cover in a later lesson. +This is the ***recommended way*** to structure your C++ code. An exception to this rule is when you are using templates. Template function must be defined in the same header file they are declared in. This is mainly a quirk of how templates work in C++. We can then include the header file in the source file where we write the function definitions. ```cpp diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md index 501e79f..7a4a9a9 100644 --- a/cpp-review/classes/lesson.md +++ b/cpp-review/classes/lesson.md @@ -458,6 +458,130 @@ Abstract classes are useful in a variety of situations: - You need to enforce a derived class to implement a certain function with certain inputs and outputs. In this way, you create an interface for outside users to follow and a *contract* that derived classes must adhere to. - This is the basis of how interfaces work in other languages. +# Practice + +Let's go through a few practice problems to check your understanding of classes in C++. + +Consider the following code: +```cpp +class MyClass { + int x; +}; +``` +Which of the following statements are true? +- `x` is a public member variable +- `MyClass` does not have a constructor +- When constructed, `x` will be uninitialized (correct) +- `MyClass` is not copyable +- None of these are true + +--- + +Consider the following code: +```cpp +int main() { + MyClass obj; + MyClass* obj_ptr = new MyClass(); + return 0; +} +``` +Which of these objects will have their destructor called when `main` returns? +- Neither of them +- `obj` only (correct) +- `obj_ptr` only +- Both `obj` and `obj_ptr` + +--- + +Consider the following code: +```cpp +class MyClass { + int x; +public: + MyClass(int x) : x(x) {} +}; +``` +Which of the following statements NOT true? +- `MyClass` is default-constructible (correct) +- `MyClass` is copy-constructible +- `MyClass` is copy-assignable +- All of these are true + +--- + +Consider the following code: +```cpp +int MyClass::get_x() const { + return x; +} +``` +What does the `const` keyword do in this context? +- The integer returned by `get_x` must be captured by a `const` variable +- The `get_x` function cannot be called on a `const` object +- The implementation of `get_x` cannot be changed +- The `get_x` function cannot modify the object's state (correct) +- It does nothing since the function does not return a reference + +--- + +Consider the following code: +```cpp +class MyClass { + std::vector data = {1, 2, 3}; +public: + int& at(int i) { + return data.at(i); + } +}; +int main() { + const int& x = MyClass().at(0); + return 0; +} +``` +What is the issue with this code? +- `data` cannot be initialized in the class definition +- `at` is not a `const` member function (correct) +- `MyClass` is not instantiated correctly +- `data` is not cleaned up when after `main` returns + +--- + +Consider the following code: +```cpp +MyClass obj; +MyClass obj2 = obj; +``` +Which function was called as a result of the second line? +- The default constructor +- The copy constructor (correct) +- The copy assignment operator +- The destructor + +--- + +What is the output of this code? +```cpp +struct Dog { + virtual void bark() {std::cout << "Woof!" << std::endl;} +}; +struct BigDog : Dog { + void bark() override {std::cout << "WOOF!" << std::endl;} +}; +int main() { + Dog* dog_ptr = new BigDog(); + dog_ptr->bark(); + delete dog_ptr; + return 0; +} +``` +- `Woof!` +- `WOOF!` (correct) +- `Woof!WOOF!` +- (compiler error) +- (runtime error due to ambiguity) + + + # Conclusion That's it for this lesson! We've covered nearly everything you need to know about C++'s syntax and object-oriented programming in C++. We hope you've enjoyed these lessons and feel more comfortable with C++. From d5a1c2bc6e5e141d4aca1ff1b8baa2e5f521fef0 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Tue, 26 Nov 2024 10:18:22 -0500 Subject: [PATCH 8/9] Adjust C++ lessons --- cpp-review/basics/lesson.md | 48 ++++++++++++++++++++++++---- cpp-review/classes/lesson.md | 56 +++++++++++++++++++++++++++------ cpp-review/containers/lesson.md | 22 +++++++++++-- cpp-review/memory/lesson.md | 41 +++++++++++++++++++----- 4 files changed, 141 insertions(+), 26 deletions(-) diff --git a/cpp-review/basics/lesson.md b/cpp-review/basics/lesson.md index a1acfd3..93cba92 100644 --- a/cpp-review/basics/lesson.md +++ b/cpp-review/basics/lesson.md @@ -500,12 +500,17 @@ int main() { return 0; } ``` -- 0 (correct) +- 0 - 0.5 - 1 - (produces a compile error) - (result is undefined) +

+Answer +0 +
+ --- What is the output of the following code? @@ -521,10 +526,16 @@ int main() { ``` - 11 - 12 -- 22 (correct) +- 22 - 21 - (produces a compile error) +
+Answer +22 +
+ + --- What is the output of the following code? @@ -540,11 +551,16 @@ int main() { } ``` - 421 -- 4210 (correct) +- 4210 - 8421 - (produces a compile error) - (program does not terminate) +
+Answer +4210 +
+ --- What is the output of the following code? @@ -558,10 +574,15 @@ int main() { ``` - 011 - 012 -- 013 (correct) +- 013 - 123 - 124 +
+Answer +013 +
+ --- What is the output of the following code? @@ -578,10 +599,15 @@ int main() { ``` - 12345 - 135 -- 13 (correct) +- 13 - 1 - (nothing is printed) +
+Answer +13 +
+ --- What is the output of the following code? @@ -600,12 +626,22 @@ int main() { return 0; } ``` -- 11 (correct) +- 11 - 12 - 21 - 22 - (produces a compile error) +
+Answer +11 +
+ # Conclusion That's it for this lesson! We've covered a lot of ground, but this is just the beginning! In the next lesson, we'll cover arrays and memory management. + +# References + +- [C++ Reference](https://en.cppreference.com/w/cpp) +- [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md index 7a4a9a9..0d1ed05 100644 --- a/cpp-review/classes/lesson.md +++ b/cpp-review/classes/lesson.md @@ -471,10 +471,15 @@ class MyClass { Which of the following statements are true? - `x` is a public member variable - `MyClass` does not have a constructor -- When constructed, `x` will be uninitialized (correct) +- When constructed, `x` will be uninitialized - `MyClass` is not copyable - None of these are true +
+Answer +When constructed, `x` will be uninitialized +
+ --- Consider the following code: @@ -487,10 +492,15 @@ int main() { ``` Which of these objects will have their destructor called when `main` returns? - Neither of them -- `obj` only (correct) +- `obj` only - `obj_ptr` only - Both `obj` and `obj_ptr` +
+Answer +`obj` only +
+ --- Consider the following code: @@ -502,11 +512,16 @@ public: }; ``` Which of the following statements NOT true? -- `MyClass` is default-constructible (correct) +- `MyClass` is default-constructible - `MyClass` is copy-constructible - `MyClass` is copy-assignable - All of these are true +
+Answer +`MyClass` is default-constructible +
+ --- Consider the following code: @@ -519,9 +534,14 @@ What does the `const` keyword do in this context? - The integer returned by `get_x` must be captured by a `const` variable - The `get_x` function cannot be called on a `const` object - The implementation of `get_x` cannot be changed -- The `get_x` function cannot modify the object's state (correct) +- The `get_x` function cannot modify the object's state - It does nothing since the function does not return a reference - + +
+Answer +The `get_x` function cannot modify the object's state +
+ --- Consider the following code: @@ -540,10 +560,15 @@ int main() { ``` What is the issue with this code? - `data` cannot be initialized in the class definition -- `at` is not a `const` member function (correct) +- `at` is not a `const` member function - `MyClass` is not instantiated correctly - `data` is not cleaned up when after `main` returns +
+Answer +`at` is not a `const` member function +
+ --- Consider the following code: @@ -553,10 +578,15 @@ MyClass obj2 = obj; ``` Which function was called as a result of the second line? - The default constructor -- The copy constructor (correct) +- The copy constructor - The copy assignment operator - The destructor +
+Answer +The copy constructor +
+ --- What is the output of this code? @@ -575,13 +605,21 @@ int main() { } ``` - `Woof!` -- `WOOF!` (correct) +- `WOOF!` - `Woof!WOOF!` - (compiler error) - (runtime error due to ambiguity) - +
+Answer +`WOOF!` +
# Conclusion That's it for this lesson! We've covered nearly everything you need to know about C++'s syntax and object-oriented programming in C++. We hope you've enjoyed these lessons and feel more comfortable with C++. + +# References + +- [C++ Reference](https://en.cppreference.com/w/cpp) + diff --git a/cpp-review/containers/lesson.md b/cpp-review/containers/lesson.md index 8826003..0638735 100644 --- a/cpp-review/containers/lesson.md +++ b/cpp-review/containers/lesson.md @@ -11,9 +11,9 @@ There are quite a few containers available in C++. Many of them use similar inte In this lesson, we will cover the following topics: - Vectors - Iterators -- Linked Lists -- Stacks, Queues, and Double-Ended Queues -- Priority Queues +- Linked lists +- Stacks, queues, and double-ended queues +- Priority queues - Sets - Maps @@ -552,6 +552,22 @@ The rest of the functions provided by maps are similar to those provided by sets - `empty()` returns `true` if the map is empty and `false` otherwise. - `size()` returns the number of elements in the map. +```cpp +std::map map = {{1, "one"}, {2, "two"}, {3, "three"}}; +map.erase(1); +if (map.find(2) != map.end()) { + std::cout << "Found" << std::endl; +} else { + std::cout << "Not found" << std::endl; +} +map.empty(); // false +map.size(); // 2 +``` + # Conclusion And that's it for this lesson on C++ containers! In this lesson, we've only covered how to use these containers. We haven't discussed how they are implemented or the theory behind them. We'll discuss these topics in later lessons. + +# References + +- [C++ Reference](https://en.cppreference.com/w/cpp) diff --git a/cpp-review/memory/lesson.md b/cpp-review/memory/lesson.md index 546273c..76a28a2 100644 --- a/cpp-review/memory/lesson.md +++ b/cpp-review/memory/lesson.md @@ -5,12 +5,12 @@ In this lesson, we'll continue where we left off in our C++ review. In this lesson, we'll cover the following topics: -- Memory Model +- Memory model - Pointers - Arrays -- Heap Memory Management -- Heap-Allocated Arrays -- Smart Pointers +- Heap memory management +- Heap-allocated arrays +- Smart pointers # Memory Model @@ -257,10 +257,15 @@ int* p = &i; Which of the following does NOT evaluate to 7? - `i` - `*p` -- `p` (correct) +- `p` - `*(&i)` - (all of these evaluate to 7) +
+Answer +`p` +
+ --- What is the output of the following code? @@ -276,10 +281,15 @@ int main() { ``` - 12345 - 1234 -- 234 (correct) +- 234 - 2345 - (results in undefined behavior/segmentation fault) +
+Answer +234 +
+ --- What is the output of the following code? @@ -294,7 +304,12 @@ int main() { - 0 - 5 - 6 -- (results in undefined behavior/segmentation fault) (correct) +- (results in undefined behavior/segmentation fault) + +
+Answer +(results in undefined behavior/segmentation fault) +
--- @@ -311,7 +326,12 @@ int main() { - `p` should have the type `int[]`, not `int*`. - The syntax after the `new` operator is incorrect for an array. - The access to `p[3]` is out of bounds. -- The `delete` operator should be `delete[]` (correct) +- The `delete` operator should be `delete[]` + +
+Answer +The `delete` operator should be `delete[]` +
# Smart Pointers @@ -359,3 +379,8 @@ For this course, you will not be expected to use smart pointers, and the project # Conclusion That's all for this lesson. We've covered the memory model, pointers, arrays, and heap memory management. In the next lesson, we'll discuss classes and object-oriented programming. + +# References + +- [C++ Reference](https://en.cppreference.com/w/cpp) +- [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) From 6b7c5ab5e313485e667e5fb4498f7eb4dc22ffe4 Mon Sep 17 00:00:00 2001 From: Brian-Magnuson <92892499+Brian-Magnuson@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:00:14 -0500 Subject: [PATCH 9/9] Add small corrections to C++ lessons --- cpp-review/basics/lesson.md | 4 ++-- cpp-review/classes/lesson.md | 10 +++++++--- cpp-review/containers/lesson.md | 4 ++-- cpp-review/memory/lesson.md | 10 ++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/cpp-review/basics/lesson.md b/cpp-review/basics/lesson.md index 93cba92..f64b905 100644 --- a/cpp-review/basics/lesson.md +++ b/cpp-review/basics/lesson.md @@ -100,7 +100,7 @@ The `#ifndef` directive is particularly useful for creating an **include guard** You can choose any name for the macro, but it should be unique to the file. Google's style guide recommends the format `___H_`. For smaller projects, simply naming the macro after the file is sufficient (as shown above). -These are most of the directives you will encounter in C++. There is, however, one more: the `#pragma` directive. This directive is used to give instructions to the compiler. However, the exact behavior of `#pragma` is compiler-dependent, so it is best to avoid using it. +These are most of the directives you will encounter in C++. There is, however, one more: the `#pragma` directive. This directive is used to give instructions to the compiler. However, the exact behavior of `#pragma` is compiler-dependent. One common use of `#pragma` is to act as a simpler include guard. ```cpp @@ -374,7 +374,7 @@ void ping(int n) {...} void pong(int n) {...} ``` -This is the ***recommended way*** to structure your C++ code. An exception to this rule is when you are using templates. Template function must be defined in the same header file they are declared in. This is mainly a quirk of how templates work in C++. +This is the ***recommended way*** to structure your C++ code. An exception to this rule is when you are using templates. Template functions must be defined in the same header file they are declared in. This is mainly a quirk of how templates work in C++. We can then include the header file in the source file where we write the function definitions. ```cpp diff --git a/cpp-review/classes/lesson.md b/cpp-review/classes/lesson.md index 0d1ed05..91033ab 100644 --- a/cpp-review/classes/lesson.md +++ b/cpp-review/classes/lesson.md @@ -67,7 +67,7 @@ public: }; class Character { public: - Point position; + Vector2D position; int health; int power; }; @@ -269,7 +269,11 @@ There is another special set of member functions called **move constructors** an # Destructors -A **destructor** is a special member function that is called when an object goes out of scope (if allocated on the stack) or is explicitly deleted (if allocated on the heap). It is used to clean up resources that the object has acquired during its lifetime. Like the constructor, it has no return type. It also does not take any arguments. +A **destructor** is another special member function. It is used to clean up resources that the object has acquired during its lifetime. It is automatically called under the following circumstances: +- If the object is allocated on the stack, the destructor is called when the object goes out of scope. +- If the object is allocated on the heap, the destructor is called when `delete` is called on the object. + +Like the constructor, it has no return type. It also does not take any arguments. ```cpp class Character { char* name; @@ -622,4 +626,4 @@ That's it for this lesson! We've covered nearly everything you need to know abou # References - [C++ Reference](https://en.cppreference.com/w/cpp) - +- [GeeksForGeeks](https://www.geeksforgeeks.org/c-plus-plus/) diff --git a/cpp-review/containers/lesson.md b/cpp-review/containers/lesson.md index 0638735..0ec29bf 100644 --- a/cpp-review/containers/lesson.md +++ b/cpp-review/containers/lesson.md @@ -211,11 +211,11 @@ C++ provides two classes that implement linked lists: `std::forward_list` and `s `std::list` is similar to an `std::vector`, but with the following differences: -- `list::insert()` and `list::erase()` have constant time complexity. +- `insert()` and `erase()` have constant time complexity. - This is because the pointers in the nodes are updated, rather than shifting elements over. - However, you still need the iterator to the element you want to insert or erase, and arriving at that element can still take linear time. - `list` provides some additional functions for adding elements: - - `list::push_front()` and `list::pop_front()` add and remove elements from the front of the list. + - `push_front()` and `pop_front()` add and remove elements from the front of the list. - These functions have constant time complexity. - `list` only provides a bidirectional iterator, so you can't use the `+`, `-`, `+=`, and `-=` operators to move to any element in the list. - `list` does not have `operator[]` or `at()` to access elements by index. diff --git a/cpp-review/memory/lesson.md b/cpp-review/memory/lesson.md index 76a28a2..f280d9e 100644 --- a/cpp-review/memory/lesson.md +++ b/cpp-review/memory/lesson.md @@ -14,7 +14,7 @@ In this lesson, we'll cover the following topics: # Memory Model -The memory used by a process is often organized into segments: +The memory used by a process is often conceptually organized into segments: - **Text Memory**: Contains the executable code. - **Data Memory**: Contains global and static variables. - **Stack Memory**: Contains local variables and function call information. @@ -26,7 +26,7 @@ The C++ standard does not use the words "stack memory" and "heap memory" and ins To avoid confusion, we'll use the terms "stack memory" and "heap memory" in this lesson and future lessons. This is also to avoid confusion between the terms "dynamic array" and "dynamically-allocated array", which are two different things. -In practice, the memory used by a process is often shuffled around by the operating system. This is primarily to avoid users from accessing memory that they shouldn't be accessing, such as text memory. However, it is useful to think of memory in this segmented manner. +In practice, the memory used by a process is managed by the operating system. Techniques such as virtual memory and address space layout randomization (ASLR) are used to protect memory and prevent unauthorized access. While the conceptual segments (text, data, stack, heap) are useful for understanding, the actual memory layout can vary and is managed to ensure security and efficiency. Whenever you create a local variable in a function, it is stored in the stack memory. ```cpp @@ -354,6 +354,12 @@ They keep track of how many shared pointers are pointing to a particular object. One way to think about this is to imagine a group of people watching TV together. The first person to enter the room turns on the TV. Each person that enters the room has access to the TV remote. Then, when the last person leaves the room, they turn off the TV. +Once initialized, smart pointers can be used almost like raw pointers. You can dereference them and pass them to functions that take pointers. +```cpp +auto p = std::make_shared>(1, 2); +std::cout << p->first << std::endl; +``` + People who first learn about shared pointers might be tempted to use them for everything to avoid leaking memory. However, ***it is still possible to create memory leaks with shared pointers***. If you have a cycle of shared pointers, the reference count will never reach zero and the memory will never be deallocated. ![Animation of heap objects referencing each other with shared pointers.](images-ppt-2.gif)