๐Ÿ”’

Sign In Required

This workbook requires a free KaliRange account.

Log In โ†’Create Account
๐Ÿ‘ถ
Install: On Linux/Kali: sudo apt install g++. On Windows: install MinGW or use VS Code with C++ extension. Compile with: g++ -o program file.cpp, run with ./program.

Chapter 1 โ€” What is C++?

C++ was created by Bjarne Stroustrup in 1979 as "C with Classes." It gives you low-level memory control AND high-level OOP. Used in: game engines (Unreal), operating systems, browsers (Chrome), security tools, high-frequency trading, and embedded systems.

Chapter 2 โ€” Hello World & Setup

// Hello World โ€” save as hello.cpp
#include <iostream>    // include input/output library
using namespace std;   // use std namespace (cout, cin, endl)

int main() {
    cout << "Hello, World!" << endl;
    return 0;   // 0 = success
}

// Compile and run:
g++ -o hello hello.cpp
./hello
# Output: Hello, World!

// Output:
cout << "Hello" << endl;    // endl = newline + flush
cout << "Hello\n";          // \n = newline (faster)
cout << 42 << " " << 3.14; // chain with <<

// Input:
int age;
cout << "Enter age: ";
cin >> age;
cout << "You are " << age << " years old." << endl;

Chapter 3 โ€” Variables & Data Types

// C++ requires explicit type declarations
int    age    = 25;       // integer (4 bytes)
long   big    = 9999999; // larger integer (8 bytes)
float  f      = 3.14f;   // 32-bit decimal
double d      = 3.14159; // 64-bit decimal (prefer over float)
char   c      = 'A';     // single character
bool   active = true;    // true or false

// auto โ€” compiler infers type (C++11):
auto x = 42;       // int
auto y = 3.14;     // double
auto z = "hello";  // const char*

// Constants:
const double PI = 3.14159265;
constexpr int MAX = 100;   // compile-time constant

// String (use #include <string>):
#include <string>
string name = "Uzair";
cout << name.length() << endl;        // 5
cout << name.substr(0, 3) << endl;    // Uza
cout << name + " Varsaji" << endl;    // Uzair Varsaji
name.replace(0, 5, "Ali");             // Ali Varsaji

// Type sizes (may vary by system):
cout << sizeof(int)    << endl;  // 4 bytes
cout << sizeof(double) << endl;  // 8 bytes

Chapter 4 โ€” Operators & Control Flow

// Same operators as Java โ€” focus on differences:
int a = 10, b = 3;
cout << a / b << endl;    // 3  (integer division!)
cout << a % b << endl;    // 1

// if/else (identical to Java):
if (a > b) { cout << "a is bigger"; }
else { cout << "b is bigger"; }

// for loop:
for (int i = 0; i < 5; i++) {
    cout << i << " ";
}  // 0 1 2 3 4

// Range-based for loop (C++11):
int nums[] = {1, 2, 3, 4, 5};
for (int n : nums) {
    cout << n << " ";
}

// while / do-while:
int count = 0;
while (count < 3) { cout << count++ << " "; }

// switch:
int choice = 2;
switch (choice) {
    case 1: cout << "One";   break;
    case 2: cout << "Two";   break;
    case 3: cout << "Three"; break;
    default: cout << "Other";
}

Chapter 5 โ€” Functions

// Function must be declared before it's called (or use prototype):
int add(int a, int b) {
    return a + b;
}

// Function prototype (declare before main, define after):
double area(double r);

int main() {
    cout << add(3, 4) << endl;    // 7
    cout << area(5.0) << endl;    // 78.5398
    return 0;
}

double area(double r) {
    return 3.14159 * r * r;
}

// Default arguments:
void greet(string name = "stranger") {
    cout << "Hello, " << name << "!" << endl;
}
greet();          // Hello, stranger!
greet("Uzair");   // Hello, Uzair!

// Function overloading:
int    multiply(int a,    int b)    { return a * b; }
double multiply(double a, double b) { return a * b; }

// Pass by reference (modify original):
void doubleIt(int &x) { x *= 2; }
int n = 5;
doubleIt(n);
cout << n;   // 10

// Lambda (C++11):
auto square = [](int x) { return x * x; };
cout << square(5);   // 25

Chapter 6 โ€” Arrays & Strings

// C-style arrays:
int nums[5] = {1, 2, 3, 4, 5};
cout << nums[0];      // 1
// Size: sizeof(nums)/sizeof(nums[0]) = 5

// std::array (C++11, safer):
#include <array>
array<int, 5> a = {10, 20, 30, 40, 50};
cout << a[2] << endl;      // 30
cout << a.size() << endl;  // 5
cout << a.at(2) << endl;   // 30 (bounds-checked)

// 2D array:
int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
cout << matrix[1][2];   // 6

// Strings (#include <string>):
string s = "Hello, World!";
cout << s.length();           // 13
cout << s[0];                 // H
cout << s.find("World");      // 7 (position)
s.append(" How are you?");
cout << s.substr(7, 5);       // World
cout << (s == "Hello")  ;     // 0 (false)

// Convert:
int n = stoi("42");            // string to int
string ns = to_string(42);    // int to string

Chapter 7 โ€” Pointers & References

// Pointers โ€” the most powerful (and dangerous) feature of C++

// & = address-of operator:
int x = 42;
cout << &x;   // prints memory address like 0x7ffee4...

// Pointer = variable that stores a memory address:
int *ptr = &x;          // ptr holds address of x
cout << ptr;            // the address
cout << *ptr;           // 42 (dereference โ€” get the value)
*ptr = 100;             // change x through the pointer
cout << x;              // 100

// Null pointer (C++11):
int *nullPtr = nullptr;   // points to nothing
if (nullPtr == nullptr) cout << "Pointer is null!";

// Pointer arithmetic:
int arr[] = {10, 20, 30};
int *p = arr;            // points to first element
cout << *p;             // 10
p++;                     // move to next element
cout << *p;             // 20

// References โ€” alias for a variable (safer than pointers):
int y = 10;
int &ref = y;    // ref IS y (same memory)
ref = 20;
cout << y;       // 20

// Pass by pointer (modify original):
void increment(int *n) { (*n)++; }
int val = 5;
increment(&val);
cout << val;   // 6

Chapter 8 โ€” Classes & OOP

class BankAccount {
private:
    string owner;
    double balance;

public:
    // Constructor:
    BankAccount(string owner, double initial = 0.0) {
        this->owner   = owner;
        this->balance = initial;
    }

    // Destructor (cleanup when object is destroyed):
    ~BankAccount() {
        cout << "Account for " << owner << " closed." << endl;
    }

    void deposit(double amount) {
        if (amount > 0) balance += amount;
    }

    bool withdraw(double amount) {
        if (amount > balance) return false;
        balance -= amount;
        return true;
    }

    double getBalance() const { return balance; }

    void display() const {
        cout << owner << ": ยฃ" << balance << endl;
    }
};

int main() {
    BankAccount acc("Uzair", 1000.0);
    acc.deposit(500.0);
    acc.withdraw(200.0);
    acc.display();   // Uzair: ยฃ1300
    return 0;
}

Chapter 9 โ€” Inheritance

// Base class:
class Shape {
protected:
    string colour;
public:
    Shape(string c) : colour(c) {}
    virtual double area() const = 0;    // pure virtual = must override
    virtual void display() const {
        cout << "Colour: " << colour << ", Area: " << area() << endl;
    }
};

// Derived classes:
class Circle : public Shape {
    double radius;
public:
    Circle(double r, string c) : Shape(c), radius(r) {}
    double area() const override { return 3.14159 * radius * radius; }
};

class Rectangle : public Shape {
    double w, h;
public:
    Rectangle(double w, double h, string c) : Shape(c), w(w), h(h) {}
    double area() const override { return w * h; }
};

int main() {
    Shape* shapes[] = {
        new Circle(5, "red"),
        new Rectangle(4, 6, "blue")
    };
    for (Shape* s : shapes) {
        s->display();
        delete s;   // free memory!
    }
}

Chapter 10 โ€” Memory Management

// Stack vs Heap:
// Stack: automatic, fast, limited size, freed when out of scope
// Heap:  manual, slower, large, YOU must free it

// new = allocate on heap, delete = free:
int *p = new int(42);    // allocate int on heap
cout << *p;              // 42
delete p;                // FREE! If you forget: memory leak
p = nullptr;             // good practice after delete

// Array on heap:
int *arr = new int[10];
for (int i = 0; i < 10; i++) arr[i] = i;
delete[] arr;            // use delete[] for arrays!

// Smart pointers (C++11) โ€” auto-delete, NO manual delete needed:
#include <memory>

unique_ptr<int> up = make_unique<int>(42);
cout << *up;    // 42 โ€” freed automatically when out of scope

shared_ptr<int> sp1 = make_shared<int>(100);
shared_ptr<int> sp2 = sp1;   // both point to same memory
// freed when BOTH go out of scope (ref count = 0)

Chapter 11 โ€” STL (Standard Template Library)

#include <vector>
#include <map>
#include <set>
#include <algorithm>

// vector โ€” dynamic array (most used container):
vector<int> v = {3, 1, 4, 1, 5, 9};
v.push_back(2);
v.pop_back();
cout << v.size();       // 6
cout << v[0];           // 3
sort(v.begin(), v.end());  // sort in place
for (int n : v) cout << n << " ";   // 1 1 3 4 5 9

// map โ€” sorted key-value pairs:
map<string, int> scores;
scores["Alice"] = 95;
scores["Bob"]   = 87;
cout << scores["Alice"];   // 95
for (auto& [key, val] : scores) {
    cout << key << ": " << val << endl;
}

// set โ€” unique sorted values:
set<int> s = {3, 1, 4, 1, 5, 9, 2, 6};
for (int n : s) cout << n << " ";   // 1 2 3 4 5 6 9

// Algorithm functions:
vector<int> nums = {5, 2, 8, 1, 9};
int mx = *max_element(nums.begin(), nums.end());   // 9
int mn = *min_element(nums.begin(), nums.end());   // 1
int total = accumulate(nums.begin(), nums.end(), 0); // 25
reverse(nums.begin(), nums.end());
sort(nums.begin(), nums.end(), greater<int>());    // descending

Chapter 12 โ€” File I/O & Projects

#include <fstream>

// Write to file:
ofstream outFile("output.txt");
if (outFile.is_open()) {
    outFile << "Hello, File!" << endl;
    outFile << "Line 2" << endl;
    outFile.close();
}

// Read from file:
ifstream inFile("output.txt");
string line;
while (getline(inFile, line)) {
    cout << line << endl;
}
inFile.close();

// PROJECT: Number Guessing Game
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
    srand(time(0));
    int secret = rand() % 100 + 1;
    int guess, attempts = 0;
    cout << "Guess the number (1-100)!" << endl;
    do {
        cout << "Your guess: ";
        cin >> guess;
        attempts++;
        if (guess < secret)      cout << "Too low!\n";
        else if (guess > secret) cout << "Too high!\n";
        else cout << "Correct! Got it in " << attempts << " tries!\n";
    } while (guess != secret);
    return 0;
}
โœ…
Workbook Complete! C++ is hard but powerful. Master it and you can build anything โ€” OS kernels, game engines, security exploits. Next: practice on Hackerrank, study data structures and algorithms, explore the Qt framework for GUI apps.
โ† All Workbooks
๐Ÿ“–
Sign in to track progress