封装:C++中的面向对象编程基石

        封装是面向对象编程(OOP)的核心概念之一,它允许将数据(属性)和操作这些数据的代码(方法)捆绑在一起。在C++中,封装通过类(class)和对象(object)实现,提供了一种将实现细节隐藏起来,只暴露出一个可以被外界访问的接口的方式

封装的理论基础

封装的主要优点包括:

  1. 数据隐藏:通过将成员变量设置为私有(private),防止外部直接访问。
  2. 接口暴露:只提供必要的公共(public)方法来访问和修改私有成员。
  3. 模块化:每个类负责一块特定的功能,使得代码更加模块化。
  4. 易于维护和扩展:封装使得修改实现细节变得更加简单,而不影响使用这些类的其他代码。

实操:封装在C++中的实现

下面是一个简单的C++封装示例,我们将创建一个BankAccount类,它具有存款和取款的功能。

#include <iostream>
#include <string>

// 定义BankAccount类
class BankAccount {
private:
    std::string accountHolder; // 账户持有者姓名
    double balance;           // 账户余额
    static double annualInterestRate; // 年利率

public:
    // 构造函数
    BankAccount(const std::string& name, double initialBalance)
        : accountHolder(name), balance(initialBalance) {}

    // 存款方法
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            std::cout << "Deposited " << amount << " credits." << std::endl;
        } else {
            std::cout << "Deposit amount must be positive." << std::endl;
        }
    }

    // 取款方法
    bool withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            std::cout << "Withdrew " << amount << " credits." << std::endl;
            return true;
        } else {
            std::cout << "Invalid withdrawal amount." << std::endl;
            return false;
        }
    }

    // 获取余额
    double getBalance() const {
        return balance;
    }

    // 设置年利率
    static void setAnnualInterestRate(double rate) {
        annualInterestRate = rate;
    }

    // 计算利息
    double calculateInterest() const {
        return balance * annualInterestRate;
    }
};

// 定义年利率
double BankAccount::annualInterestRate = 0.03;

int main() {
    BankAccount account("John Doe", 1000);

    account.deposit(200);
    if (account.withdraw(50)) {
        std::cout << "Current Balance: " << account.getBalance() << std::endl;
    }

    BankAccount::setAnnualInterestRate(0.04);
    std::cout << "Interest: " << account.calculateInterest() << std::endl;

    return 0;
}

代码解析

  1. 私有成员accountHolder 和 balance 是私有成员变量,它们不能被外部直接访问。
  2. 公共方法depositwithdrawgetBalancesetAnnualInterestRate, 和 calculateInterest 是公共成员函数,提供了与类交互的接口。
  3. 静态成员annualInterestRate 是静态成员变量,属于类本身,而不是类的某个特定对象。
  4. 常量成员函数getBalance 和 calculateInterest 被声明为 const,表示它们不会修改对象的状态。

C++中 structclass 的一些主要区别

特性structclass
默认访问权限publicprivate
继承访问权限公有(public)私有(private)
用途通常用于简单的数据结构用于定义具有封装、继承和多态性的类对象
构造函数可以有默认构造函数可以有默认构造函数
析构函数可以有默认析构函数可以有默认析构函数
继承可以被继承,作为基类或派生类可以被继承,作为基类或派生类
多态可以通过包含虚函数实现可以通过包含虚函数实现
访问说明符必须显式指定每个成员的访问级别必须显式指定每个成员的访问级别
接口定义不常用于定义接口可以通过纯虚函数定义抽象基类
存储要求不需要单独的实现文件(.cpp),除非有成员函数定义不需要单独的实现文件(.cpp),除非有成员函数定义
习惯用法在C++98之前,struct常用于定义简单的数据结构;class用于定义需要封装的对象从C++98开始,推荐使用class来定义所有类型的对象,包括简单的数据结构

        请注意,C++中 structclass 的语法几乎相同,主要区别在于默认的访问权限和继承访问权限。从C++98标准开始,推荐使用 class 关键字来定义所有的数据类型,因为 class 提供了更严格的封装和更明确的含义。然而,struct 在某些特定的上下文中仍然被使用,特别是当需要定义一个简单的数据结构,且希望保持与C语言的兼容性。

C++ 封装 - 菜鸟教程 (cainiaoya.com)icon-default.png?t=N7T8https://www.cainiaoya.com/cplus/cplus-encapsulation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值