首页 > 后端开发 > C++ > 正文

如何用C++结构体模拟面向对象 封装与数据抽象的简单实现

P粉602998670
发布: 2025-08-08 10:45:01
原创
1057人浏览过

c++++中,可以使用结构体模拟面向对象思想。1. 通过结构体与函数结合可模拟封装,将数据和操作放在一起并通过函数控制访问,如使用set_age函数限制年龄设置;2. 利用头文件声明不完整结构体与源文件实现分离,可实现数据抽象,使用户仅知接口不知实现细节;3. 结构体嵌套函数指针可模拟方法调用,让结构体拥有类似对象的行为,如point结构体包含move方法。通过这三种方式,可在c++中用结构体实现面向对象的基本思想。

如何用C++结构体模拟面向对象 封装与数据抽象的简单实现

在C++中,虽然它本身是一门面向对象的语言,支持类、继承、多态等特性,但如果你只想用结构体(struct)来模拟一些面向对象的基本思想,比如封装和数据抽象,也是完全可以实现的。关键在于理解这些概念的本质,并合理利用结构体的特性和函数配合。

如何用C++结构体模拟面向对象 封装与数据抽象的简单实现

1. 用结构体+函数模拟封装

封装的核心是把数据和操作数据的方法放在一起,并对外隐藏实现细节。虽然结构体默认成员是公开的,但我们可以通过一些方式来“模拟”私有性。

如何用C++结构体模拟面向对象 封装与数据抽象的简单实现

举个例子:

立即学习C++免费学习笔记(深入)”;

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人
struct Person {
    char name[32];
    int age;
};

void set_age(Person* p, int age) {
    if (age >= 0 && age <= 150)
        p->age = age;
    else
        p->age = 0;
}
登录后复制

这段代码里,我们没有暴露直接修改

age
登录后复制
的方式,而是通过一个函数去设置年龄,并做了简单的合法性检查。虽然
age
登录后复制
还是可以被外部直接访问,但至少引导使用者走“正确的路”。

如何用C++结构体模拟面向对象 封装与数据抽象的简单实现
小技巧:如果想进一步限制访问,可以把结构体内字段命名得不那么直观,比如加前缀 _age,并强调建议使用配套函数操作。

2. 模拟数据抽象:只暴露接口,隐藏实现

数据抽象的重点是用户只需要知道怎么用,不需要关心内部怎么实现。你可以通过头文件和源文件分离的方式来实现这一点。

举个例子:

立即学习C++免费学习笔记(深入)”;

person.h

typedef struct Person Person;

Person* create_person(const char* name, int age);
void destroy_person(Person* p);
void print_person(const Person* p);
登录后复制

person.c / person.cpp

#include "person.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Person {
    char name[64];
    int age;
};

Person* create_person(const char* name, int age) {
    Person* p = (Person*)malloc(sizeof(Person));
    strcpy(p->name, name);
    p->age = age;
    return p;
}

void destroy_person(Person* p) {
    free(p);
}

void print_person(const Person* p) {
    printf("Name: %s, Age: %d\n", p->name, p->age);
}
登录后复制

在这个设计中,用户只能看到函数声明和一个不完整的结构体类型定义,完全不知道结构体内部长什么样。这样就实现了某种程度的数据抽象。


3. 结构体嵌套函数指针,模拟方法调用

如果你想更贴近面向对象一点,可以用函数指针让结构体“自带方法”。例如:

typedef struct {
    int x;
    int y;
    void (*move)(struct Point*, int dx, int dy);
} Point;

void point_move(Point* p, int dx, int dy) {
    p->x += dx;
    p->y += dy;
}

Point* create_point(int x, int y) {
    Point* p = (Point*)malloc(sizeof(Point));
    p->x = x;
    p->y = y;
    p->move = point_move;
    return p;
}
登录后复制

这样你就可以像这样调用:

Point* p = create_point(10, 20);
p->move(p, 5, 5);  // 移动坐标
登录后复制

虽然看起来有点别扭,但这种方式已经非常接近“对象带方法”的形式了。


总结一下

  • 用结构体+函数可以模拟封装,控制数据访问
  • 用不完整结构体 + 接口函数,可以实现数据抽象。
  • 函数指针可以让结构体拥有“自己的方法”,模拟对象行为。

基本上就这些。结构体虽然不是类,但只要思路对了,也能写出结构清晰、逻辑清楚的面向对象风格代码。

以上就是如何用C++结构体模拟面向对象 封装与数据抽象的简单实现的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号