C++的面向对象编程是一种以对象为核心的编程范式,它将数据和操作数据的方法封装在一起,通过类来定义对象的属性和行为,大幅提升了代码的复用性和可维护性。这种编程方式更符合人类对现实世界的认知逻辑,适合开发规模较大的软件项目。

什么是类和对象
类是C++中面向对象的基础,它是对一类事物的抽象描述,定义了这类事物共有的属性和行为。而对象是类的具体实例,是根据类的定义创建出来的具体个体。
比如我们可以定义一个<Person>类,描述人的姓名、年龄这些属性,以及吃饭、走路这些行为,然后创建具体的<Person>对象代表某个具体的人。
下面是一个简单的类定义和对象创建的示例:
#include <iostream>
#include <string>
using namespace std;
// 定义Person类
class Person {
public:
// 成员变量,代表属性
string name;
int age;
// 成员函数,代表行为
void eat() {
cout << name << "正在吃饭" << endl;
}
void walk() {
cout << name << "正在走路" << endl;
}
};
int main() {
// 创建Person类的对象
Person p1;
p1.name = "张三";
p1.age = 20;
p1.eat();
p1.walk();
Person p2;
p2.name = "李四";
p2.age = 22;
p2.eat();
return 0;
}
封装特性
封装是面向对象的三大特性之一,它的核心思想是将类的内部实现细节隐藏起来,只对外暴露必要的接口,避免外部直接修改类的内部数据,保证数据的安全性。
在C++中,我们通过访问权限修饰符来实现封装,常用的修饰符有三个:
- public:公有成员,外部可以直接访问
- private:私有成员,只有类内部的成员函数可以访问,外部无法直接访问
- protected:保护成员,类内部和派生类可以访问,外部无法直接访问
通常我们会把成员变量设置为private,然后提供public的getter和setter函数来间接访问和修改成员变量,这样可以在函数内部添加校验逻辑,避免非法赋值。
封装的示例代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
// 私有成员变量,外部无法直接访问
string stuName;
int stuAge;
public:
// 设置姓名的公有接口
void setName(string name) {
stuName = name;
}
// 获取姓名的公有接口
string getName() {
return stuName;
}
// 设置年龄的公有接口,添加年龄校验
void setAge(int age) {
if (age > 0 && age < 150) {
stuAge = age;
} else {
cout << "年龄输入不合法" << endl;
}
}
// 获取年龄的公有接口
int getAge() {
return stuAge;
}
};
int main() {
Student s;
s.setName("王五");
s.setAge(18);
cout << "学生姓名:" << s.getName() << ",年龄:" << s.getAge() << endl;
// 直接访问私有成员会报错:s.stuAge = 20;
return 0;
}
继承特性
继承允许我们基于一个已有的类创建新的类,新类会自动拥有已有类的所有属性和行为,还可以添加自己特有的属性和行为,或者重写已有类的行为。已有的类称为父类或基类,新创建的类称为子类或派生类。
继承的语法是在子类定义时,在类名后加冒号,然后写public 父类名。继承可以减少重复代码,提升代码的复用性。
继承的示例代码如下:
#include <iostream>
#include <string>
using namespace std;
// 基类:动物类
class Animal {
public:
string name;
void eat() {
cout << name << "在吃东西" << endl;
}
};
// 派生类:狗类,继承自动物类
class Dog : public Animal {
public:
void bark() {
cout << name << "在汪汪叫" << endl;
}
};
int main() {
Dog dog;
dog.name = "小黑"; // 继承来的属性
dog.eat(); // 继承来的行为
dog.bark(); // 子类特有的行为
return 0;
}
多态特性
多态指的是同一个行为作用于不同的对象,会产生不同的表现结果。C++中的多态主要通过虚函数来实现,需要在父类中把函数声明为virtual,子类重写这个虚函数,然后通过父类的指针或引用指向子类的对象,调用函数时会自动执行子类的重写版本。
多态的示例代码如下:
#include <iostream>
#include <string>
using namespace std;
// 基类
class Shape {
public:
// 虚函数,计算面积
virtual double getArea() {
return 0;
}
};
// 派生类:圆形
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 重写基类的虚函数
double getArea() override {
return 3.14 * radius * radius;
}
};
// 派生类:矩形
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
// 重写基类的虚函数
double getArea() override {
return width * height;
}
};
int main() {
Shape* shape1 = new Circle(5);
Shape* shape2 = new Rectangle(4, 6);
cout << "圆形面积:" << shape1->getArea() << endl;
cout << "矩形面积:" << shape2->getArea() << endl;
delete shape1;
delete shape2;
return 0;
}
面向对象概念总结
C++的面向对象编程围绕类、对象、封装、继承、多态这几个核心概念展开。类是对象的模板,对象是类的实例;封装保证数据安全,继承提升代码复用,多态让程序更灵活。掌握这些基本概念,是学习C++进阶特性和开发实际项目的基础,需要在实践中不断练习加深理解。