面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它围绕着“对象”这个核心概念构建。在OOP中,对象是数据(属性)和行为(方法)的封装体,模仿现实世界的实体,使软件设计更加直观、灵活和易于维护。
面向对象的三大基石
-
封装(Encapsulation):隐藏对象的内部实现细节,仅通过公开接口与外部交互。C++中通过访问修饰符(public, private, protected)实现封装,确保数据安全和代码模块化。
-
继承(Inheritance):允许子类继承父类的属性和方法,实现代码复用和扩展。C++中的继承用
:
表示,如class Derived : public Base
,其中Derived
继承自Base
。 -
多态(Polymorphism):允许使用父类接口引用子类对象,实现接口的多种表现形式。C++中通过虚函数(virtual function)和抽象类(abstract class)实现多态。
类与对象
-
类(Class):定义了一组属性和行为的蓝图。类的默认访问控制是私有(private),意味着外部不能直接访问类的私有成员。
-
对象(Object):类的具体实例,拥有独立的内存空间存储其属性值,共享类的成员函数。
this指针
this
是一个隐含的指针,指向当前调用成员函数的对象实例。在成员函数内部,this
可用于访问当前对象的成员变量,特别是在同名局部变量和成员变量之间区分时尤为重要。
class Person {
public:
std::string name;
void setName(std::string n) {
name = n; // 实际上是 this->name = n;
}
};
常对象与常函数
- 常对象:用
const
修饰,确保对象一旦创建,其数据成员不能被修改。 - 常函数:成员函数后跟
const
关键字,表明该函数不会修改对象的状态。
构造函数与初始化列表
构造函数在对象创建时被调用,用于初始化成员变量。初始化列表(initializer list)以冒号开始,紧跟在构造函数的参数列表之后,用于直接初始化成员变量,尤其是在处理常量、引用和类类型成员时尤为重要。
class Date {
public:
Date(int year, int month, int day)
: year(year), month(month), day(day) {} // 初始化列表
private:
int year, month, day;
};
拷贝构造函数与拷贝赋值运算符
- 拷贝构造函数:当一个新对象通过已存在的同类型对象创建时调用,用于“深复制”或“浅复制”对象。
- 拷贝赋值运算符:当一个对象用已存在的对象赋值时调用,确保对象状态正确更新。
类型转换构造函数与explicit关键字
- 类型转换构造函数:允许从一个类型隐式转换为另一个类型。
- explicit:标记在单参数构造函数前,阻止隐式转换,强制显式转换。
通过这些机制,面向对象编程不仅提供了一种组织和管理代码的强大方式,还增强了代码的可读性、可维护性和可扩展性。实践中,灵活运用这些原则和技巧,可以开发出更加高效、可靠的软件系统。