C++ has been a staple in the world of programming for decades. Renowned for its efficiency and control, it offers a treasure trove of features.Â
Among these, classes and objects stand out as fundamental concepts that are crucial for mastering object-oriented programming.
What Are Classes and Objects?
If you've ever built something with LEGO, you'll get the idea. Imagine a class as the blueprint for building a LEGO house. It defines how each brick should fit together to create the structure. An object, then, would be a house built from that blueprint. It's the actual thing you can see and touch, based on the plans you laid out.
Defining a Class in C++
In C++, a class serves as a template. It allows you to define data and the functions that operate on that data. Here's a simple example:
class Car {
public:
string brand;
string model;
int year;
void honk() {
cout << "Beep beep!" << endl;
}
};
In this snippet, we've created a Car
class. This class has three data members: brand
, model
, and year
. It also has a function honk()
that outputs a sound.
Creating Objects from Classes
Once you have a class, you can create objects from it. Continuing with our LEGO analogy, this means building a car using the template.
Car myCar;
myCar.brand = "Toyota";
myCar.model = "Corolla";
myCar.year = 2020;
cout << myCar.brand << " " << myCar.model << " " << myCar.year << endl;
myCar.honk();
Here, myCar
is an object of the Car
class. We've assigned values to its data members and used its honk()
function.
Constructors: Setting Up Objects
Objects often need special setup when they're created. This is where constructors come in. A constructor initializes an object upon creation. Think of it as the setup instructions in our LEGO set that tell you how to start building.
Using Constructors
Here's how you can add a constructor to the Car
class:
class Car {
public:
string brand;
string model;
int year;
Car(string b, string m, int y) {
brand = b;
model = m;
year = y;
}
void honk() {
cout << "Beep beep!" << endl;
}
};
Car myCar("Toyota", "Corolla", 2020);
cout << myCar.brand << " " << myCar.model << " " << myCar.year << endl;
In this updated class, the constructor takes three arguments and initializes the class data members accordingly.
The Power of Encapsulation
Encapsulation is a core concept in object-oriented programming. It's like putting your LEGO house behind a glass case. It keeps the details of how the house is built hidden from the outside world.
Implementing Encapsulation
In C++, you can control access to class members using the keywords public
, private
, and protected
.
class SafeCar {
private:
string color;
public:
void setColor(string c) {
color = c;
}
string getColor() {
return color;
}
};
In this example, the color
member is private, meaning it can't be accessed directly from outside the class. Instead, you provide methods to set and get its value.
Inheritance: Building on the Past
Think of inheritance as evolving your LEGO set with an extension pack. You can build a new car based on an existing design, without starting from scratch.
Creating a Derived Class
Here's how you can extend the Car
class using inheritance:
class ElectricCar : public Car {
public:
int batteryLife;
ElectricCar(string b, string m, int y, int bl) : Car(b, m, y) {
batteryLife = bl;
}
void display() {
cout << brand << " " << model << " (" << year << ") with " << batteryLife << " hours of battery life." << endl;
}
};
ElectricCar myElectricCar("Tesla", "Model S", 2023, 24);
myElectricCar.display();
ElectricCar
inherits from the Car
class, adding a new member batteryLife
and a method display()
to show all details.
Polymorphism: The Art of Flexibility
Polymorphism in programming is like having a LEGO piece that can transform into different shapes. It allows objects to be treated as instances of their parent class.
Understanding Polymorphic Behavior
Consider this example with polymorphism:
class Vehicle {
public:
virtual void honk() {
cout << "Generic vehicle honk!" << endl;
}
};
class Truck : public Vehicle {
public:
void honk() override {
cout << "Truck horn string!" << endl;
}
};
Vehicle* myVehicle = new Truck();
myVehicle->honk(); // Outputs: Truck horn string!
Polymorphism lets myVehicle
use the Truck
class's honk()
method, despite being a Vehicle
pointer.