面向对象编程(Object-Oriented Programming, OOP)是C++语言的一个重要特性,它允许开发者以更直观和模块化的方式来设计和构建程序。OOP的四个主要原则是:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)和抽象(Abstraction)。
1、封装
封装是将数据和操作数据的方法绑定在一起,形成一个不可分割的整体(即对象)。通过封装,可以隐藏对象的内部实现细节,只对外暴露必要的接口。
C++ 的类一般定义在头文件里
Person.h
#pragma once
#include <string>
#include <iostream>
using namespace std;
class Person
{
protected:
int number;
string name;
public:
void setNumber(int newNumber) {
number = newNumber;
}
int getNumber() {
return number;
}
void setName(string newName) {
name = newName;
}
string getName() {
return name;
}
void say() {
cout << "hello";
}
};
#pragma once 程序编译一次
private 修饰的变量为成员属性,成员属性只能通过get、set方法调用
对象创建和方法调用
#include <string>
#include <iostream>
#include "Person.h"
using namespace std;
void main() {
Person stu;
stu.setNumber(10);
cout << stu.getNumber() << endl;
stu.say();
}
2、继承
继承允许新的类(子类或派生类)继承现有类(父类或基类)的属性和方法。这有助于代码复用和扩展。
#pragma once
#include "Person.h"
class Student :public Person
{
private:
double score;
public:
void setScore(double newScore) {
score = newScore;
}
double getScore() {
return score;
}
string toString() {
return "[" + to_string(getNumber()) + ","
+ getName() + "," + to_string(getScore())+"]";
}
};
Student类继承了Person基类
3、多态
多态允许将父类对象视为子类对象来处理,从而实现接口的动态绑定。C++中的多态通常通过虚函数(virtual function)来实现。
多态实现条件:
1)子类继承父类
2)子类重写父类方法
3)子类向上转型
父类Animal
class Animal
{
public:
virtual void makeSound() {
cout << "animal sound" << endl;
}
};
子类 Dog ,并且实现父类方法
class Dog : public Animal
{
public:
void makeSound() override{
cout << "dog sound" << endl;
}
};
子类 Cat ,并且实现父类方法
class Cat : public Animal
{
public:
void makeSound() override {
cout << "cat sound" << endl;
}
};
子类向上转型
void playSound(Animal& animal) {
animal.makeSound();
}
int main() {
Dog dog;
Cat cat;
playSound(dog); //输出 dog sound
playSound(cat); //输出 cat sound
return 0;
}
makeSound
函数在Animal
类中声明为虚函数,并在Dog
和Cat
类中重写。这使得playSound
函数可以接收不同类型的Animal
对象,并根据对象的实际类型调用相应的makeSound
方法。
4、抽象
抽象是指将复杂系统的实现细节隐藏起来,只暴露其接口或公共行为。在C++中,抽象通常通过抽象基类(包含纯虚函数的类)来实现。
class Shape
{
public:
virtual void draw() = 0;//纯虚函数
};
class Circle : public Shape
{
public:
void draw() override {
cout << "drawing circle" << endl;
}
};
class Square : public Shape
{
public:
void draw() override {
cout << "drawing square" << endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Square();
shape1->draw();
shape2->draw();
return 0;
}
Shape
类是一个抽象基类,包含一个纯虚函数draw
。Circle
和Square
类继承自Shape
类,并实现了draw
方法。