当前位置:首页 > 技术 > 正文内容

C++类与对象基础指南

访客 技术 2026年9月19日 11

类与对象

引言

在准备实习之际,回顾过往C++开发经验,我发现许多初学者常在面向对象编程概念上遇到困惑。本文旨在以清晰易懂的方式解释C++中类和对象的核心概念,帮助读者建立扎实的编程基础。

面向对象与面向过程编程

C语言作为C++的前身,是一种典型的面向过程编程语言。而C++则引入了面向对象编程范式。C++的设计初衷确实是为了在C语言基础上添加类机制("C with class"),虽然现代C++已远超此范围,但类机制的重要性不言而喻。

两种编程思想的区别可以通过一个实际场景来理解:假设我们要开发一个图书管理系统。

  • 面向过程方法:我们会设计一系列处理图书信息的函数,如添加图书、删除图书、查询图书等,每个函数负责特定的操作步骤。
  • 面向对象方法:我们会创建一个"图书管理系统"类,将所有相关的数据和操作封装在这个类中,系统外部无法直接干预其内部实现。

面向对象的优势在于:每次需要图书管理系统时,只需实例化一个系统对象即可,代码组织更加结构化和模块化。

类的定义与结构

class Publication
{
private:
    std::string title_;
    int pages_;
    std::string author_;
};

这是一个基本的类定义。如果将class关键字替换为struct,在语法上与C语言的结构体相似,但语义上存在重要差异。

访问控制修饰符

C++引入了访问控制机制,这与C语言的结构体有本质区别。在C语言中,结构体成员可以直接通过点操作符或箭头操作符访问,而在C++中,这种直接访问受到限制。

封装思想要求类的内部实现与外部使用隔离,因此C++类的成员默认为私有访问权限。当然,C++也提供了明确指定访问权限的能力:

class Book
{
public:
    std::string title;
    int page_count;
    
private:
    std::string isbn;
    bool is_available;
};
  • public修饰的成员可以在类外直接访问
  • private和protected修饰的成员在类外不能直接访问(在当前讨论中,二者行为相似)
  • 访问权限的作用域从修饰符出现的位置开始,直到下一个修饰符或类定义结束
  • class的默认访问权限为private,而struct为public(为了保持与C语言的兼容性)

protected修饰符的具体应用将在后续的继承和多态章节中详细讨论,目前可将其视为与private等效。

类的作用域特性

类定义中的花括号形成了一个独立的作用域。在这个作用域内,成员之间可以互相访问,无论它们在类定义中的位置如何。这是C++与早期C语言的一个重要区别:

class Calculator
{
public:
    int a;
    int b;
    
    int sum() 
    {
        // 可以访问类中任何成员,即使它们在定义之后
        return add(a, b);
    }
    
private:
    int add(int x, int y) 
    {
        return x + y;
    }
};

Calculator calc;
calc.a = 10;
calc.b = 20;
int result = calc.sum(); // 结果为30

这种设计使得类的实现更加灵活,开发者可以在类定义的任何位置引用其他成员,无需考虑声明顺序。

实践示例

让我们通过一个完整的示例来展示类的定义和使用:

class BankAccount
{
public:
    // 构造函数
    BankAccount(std::string owner, double initial_balance) 
        : owner_(owner), balance_(initial_balance) {}
    
    // 存款方法
    void deposit(double amount) 
    {
        if (amount > 0) 
        {
            balance_ += amount;
            std::cout << "存款成功,当前余额: " << balance_ << std::endl;
        }
    }
    
    // 取款方法
    bool withdraw(double amount) 
    {
        if (amount > 0 && balance_ >= amount) 
        {
            balance_ -= amount;
            std::cout << "取款成功,当前余额: " << balance_ << std::endl;
            return true;
        }
        std::cout << "取款失败" << std::endl;
        return false;
    }
    
    // 查询余额
    double get_balance() const 
    {
        return balance_;
    }

private:
    std::string owner_;
    double balance_;
};

// 使用示例
BankAccount account("张三", 1000.0);
account.deposit(500.0);
account.withdraw(200.0);
std::cout << "账户余额: " << account.get_balance() << std::endl;

这个示例展示了如何封装银行账户的相关数据和操作,通过公共接口提供存取款功能,同时隐藏账户所有者和余额等内部细节。

总结

本文介绍了C++中类和对象的基本概念,包括类的定义、访问控制修饰符以及类的作用域特性。通过理解这些基础概念,开发者可以开始构建结构化的面向对象程序。在后续文章中,我们将深入探讨类的构造与析构、继承、多态等高级特性。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。