C++ 类与对象核心概念:定义、封装与实例化

落日邮差
落日邮差
发布时间:2026-10-13| 6人浏览过
原创

C++ 中的类(Class)是一种用户自定义的数据类型,它将数据(属性)和操作数据的函数(行为)封装在一起。对象是类在内存中的具体存在形式。理解类的定义、访问权限修饰符以及如何正确创建和访问对象,是掌握 C++ 面向对象编程的基础。

什么是类和对象

类是对现实中事物的抽象描述。在 C++ 语境下,任何具有共同特征和操作的事物都可以定义为类。一个标准的类由两部分组成:

  • 属性(数据成员):描述事物的特征,通常对应基本数据类型或复杂结构。
  • 行为(成员函数):描述事物能做的操作,即函数实现。

对象则是类的实例化结果,即将抽象的类转化为内存中具体的实体。例如,“人类”是一个类,而“张三”就是该类的一个具体对象。C++ 类的三大核心特性为封装、继承和多态。

类的定义与访问权限

C++ 使用 class 关键字来定义类。类的内部成员可以设置不同的访问权限,这是实现封装的关键。

第1步:定义类结构

类的定义必须以分号结尾。在权限限定词之后,可以声明数据成员和成员函数。

#include <iostream>
#include <string>
using namespace std;

class GirlFriend {
    // ... 成员声明 ...
}; // 注意末尾的分号不能省略

第2步:配置访问权限修饰符

C++ 提供了三种主要的访问控制权限:

  1. public(公有):类外可以通过对象直接访问。通常用于提供对外接口(如 getter/setter、初始化方法)。
  2. protected(保护):仅限类本身及其派生类访问。用于支持继承体系中的共享资源。
  3. private(私有):仅限类自身访问。外部无法直接读写,必须通过公有的成员函数进行间接访问。这是数据安全的主要保障。

重要规则:

  • 如果类中未显式指定权限修饰符,默认所有成员均为 private。
  • 如果是 struct 定义的类,默认所有成员均为 public。
  • 权限限制仅针对类外访问。在类内部的成员函数之间,没有任何访问壁垒。

对象的创建与初始化

定义类后,就可以创建对象。常见的创建方式包括栈分配、堆分配和对象数组。

第1步:普通对象与数组创建

在栈上创建对象时,如果没有提供构造函数,编译器会自动调用默认行为。对于含有成员的对象数组,每个元素都会被独立创建。

第2步:堆动态分配

使用 new 运算符在堆区动态创建对象,需要手动管理内存,使用完毕后务必调用 delete 并置空指针,防止内存泄漏。

成员函数的实现与访问

为了保证数据的安全性,通常不建议直接暴露私有成员变量。应通过公共的成员函数(接口)来控制数据的读写。

第1步:提供初始化接口

在类内直接写逻辑比较简单的方法适合简单类。对于复杂类或在类外实现的函数,需要使用作用域解析运算符 :: 指明函数所属的类。

#include <iostream>
#include <string>
using namespace std;

class GirlFriend {
public:
    // 共有接口:初始化数据
    void initData(string name, int age) {
        m_name = name;
        m_age = age;
    }

    // 共有接口:打印数据
    void printData() {
        cout << m_name << "\t" << m_age << endl;
    }

    // 返回值引用:允许类外修改私有成员(需谨慎使用)
    string& getName() { return m_name; }
    int& getAge() { return m_age; }

protected:
    // 保护属性
    string m_name;
private:
    // 私有属性:类外无法直接访问
    int m_age;
};

// 类外实现函数示例(若需分离声明与定义)
// void GirlFriend::initData(string name, int age) {
//     m_name = name;
//     m_age = age;
// }

int main() {
    GirlFriend Lisa;
    
    // 方式1:通过接口初始化
    Lisa.initData("Lisa", 19);
    Lisa.printData();
    
    // 方式2:通过返回引用的get方法直接赋值
    GirlFriend mm;
    mm.getName() = "mm";
    mm.getAge() = 18;
    mm.printData();

    // 错误示范:类外无法直接访问私有成员
    // Lisa.m_name = "Test"; // 编译错误
    
    return 0;
}

第2步:利用类封装简化数据结构

在处理如链表等复杂数据结构时,将节点数据和操作封装在类中,比纯 C 语言的结构体加函数指针方式更具优势,避免了频繁的类型转换和参数传递。

// 使用类封装链表节点和列表

class Node {
public:
    // 提供访问接口以隐藏实现细节
    Node*& getNext() { return next; }
    int& getData() { return data; }
protected:
    int data;
    Node* next;
};

class List {
public:
    void createList() {
        headNode = new Node;
        headNode->getNext() = nullptr;
    }

    void insertData(int data) {
        Node* newNode = new Node;
        newNode->getNext() = nullptr;
        newNode->getData() = data;

        // 头插法
        newNode->getNext() = headNode->getNext();
        headNode->getNext() = newNode;
    }

    void printList() {
        Node* pMove = headNode->getNext();
        while (pMove != nullptr) {
            cout << pMove->getData() << "\t";
            pMove = pMove->getNext();
        }
        cout << endl;
    }
protected:
    Node* headNode; // 指向头结点的指针
};

void testList2() {
    List* pList = new List;
    pList->createList();
    pList->insertData(10);
    pList->insertData(20);
    pList->printList();
    delete pList;
}

int main() {
    testList2();
    return 0;
}

总结

C++ 的类机制通过将数据与行为捆绑,并利用 public/protected/private 权限控制,实现了信息隐藏和模块化。在实际开发中,应优先使用类提供的公共接口(如 initData, getName)来访问和修改数据,而不是直接操作成员变量。同时,对于动态创建的对象,记得在不再使用后释放内存,以保证程序的稳定性。以上就是 C++ 类和对象基本概念及操作的详细内容,更多关于 C++ 面向对象编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。