面向对象编程(Object-Oriented Programming, OOP)不仅是一种编程范式,更是一种思考和设计软件的方法。本文将深入探讨OOP中的几个核心概念,包括析构函数、深浅拷贝、静态成员、单例模式、操作符重载、友元以及前++与后++的区别,并通过具体例子加以说明。
目录
析构函数
定义
作用
示例
析构函数
定义
析构函数以波浪线(~
)开头,无返回类型,也无参数,用于释放对象占用的资源。它是对象生命周期结束时自动调用的特殊成员函数。
作用
- 清理资源:销毁对象的成员变量,特别是那些动态分配的内存。
- 执行清理操作:执行任何在对象被销毁前需要完成的任务。
示例
class A{};class AutoPtr {
public:AutoPtr(A* f) : m_f(f) {printf("AutoPtr(A* f)\n");}~AutoPtr() {printf("~AutoPtr()\n");delete m_f;}A* operator->() {return m_f;}A& operator*() {return *m_f;}AutoPtr(const AutoPtr& that){this->m_f = that.m_f;}
private:A* m_f;
};
深浅拷贝
概念
- 浅拷贝:默认拷贝构造函数和拷贝赋值操作符只复制指针,不复制指针所指的数据。
- 深拷贝:手动定义拷贝构造函数和拷贝赋值操作符,确保指针所指数据也被复制。
示例
class DeepCopyExample {
public:DeepCopyExample(int size) {m_data = new int[size];for (int i = 0; i < size; ++i) m_data[i] = i;}// 深拷贝构造函数DeepCopyExample(const DeepCopyExample& other) {m_size = other.m_size;m_data = new int[m_size];std::copy(other.m_data, other.m_data + m_size, m_data);}// 深拷贝赋值运算符DeepCopyExample& operator=(const DeepCopyExample& other) {if (this != &other) {delete[] m_data;m_size = other.m_size;m_data = new int[m_size];std::copy(other.m_data, other.m_data + m_size, m_data);}return *this;}~DeepCopyExample() {delete[] m_data;}private:int* m_data;int m_size;
};
静态成员
特点
- 生命周期:静态成员不属于任何对象实例,从程序开始执行到结束。
- 访问:可通过类名直接访问,无需实例化对象。
- 共享:静态成员变量为类的所有实例共享。
示例
class Counter {
public:static int getCount() { return count; }static void incrementCount() { ++count; }private:static int count; // 静态成员变量,需要在类外初始化
};// 静态成员变量的初始化
int Counter::count = 0;
单例模式
目标
确保一个类只有一个实例,并提供一个全局访问点。
实现
- 私有构造函数:防止外部直接创建对象。
- 静态公共成员函数:作为获取实例的唯一入口。
示例(懒汉式)
#include <string>
#include <iostream>
#include <memory>class imageSaveThread{
public:~imageSaveThread();static std::shared_ptr<imageSaveThread>& getInstance(const std::string& filePath){//静态方法 不使用对象调用if(ImageSaveThread == nullptr){ImageSaveThread = std::shared_ptr<imageSaveThread>(new imageSaveThread(filePath));}return ImageSaveThread;};void complex();static int statics;
private:imageSaveThread(std::string filePath);imageSaveThread(const imageSaveThread&) = delete;imageSaveThread& operator=(const imageSaveThread&)=delete;static std::shared_ptr<imageSaveThread> ImageSaveThread;std::string filePath;};
操作符重载
用途
改变或扩展操作符在特定类中的行为,使其适用于自定义类型。
示例
class Complex {
public:Complex(double real, double imag) : real_(real), imag_(imag) {}Complex operator+(const Complex& other) const {return Complex(real_ + other.real_, imag_ + other.imag_);}private:double real_;double imag_;
};// 使用
Complex a(1, 2);
Complex b(3, 4);
Complex c = a + b; /
友元
作用
允许一个类或函数访问另一个类的私有和保护成员。
示例
class Circle {friend class Rectangle; // 声明Rectangle为友元类private:double radius;public:Circle(double r) : radius(r) {}
};class Rectangle {
public:void printCircleRadius(const Circle& c) {std::cout << "Circle radius: " << c.radius << std::endl; // 可以访问Circle的私有成员}
};
通过以上讨论和示例,我们可以看到,面向对象编程的这些高级特性极大地丰富了代码的表现力和功能,同时也要求开发者更加细致地考虑对象的生命周期管理、资源分配与释放、以及类间的关系与访问权限,从而设计出更加健壮和高效的软件系统。