Java转C之模块化和封装

news2024/12/16 5:41:13

C 和 C++ 中的 模块化封装 是两种重要的编程思想,它们帮助开发者组织代码,使程序更易于理解、维护和扩展。以下是详细的解释,包括它们的概念、在 C 和 C++ 中的具体实现方式,以及与 Java 的对比。


一、模块化

1. 概念

模块化是一种将程序分解为多个独立的、可复用的模块的方法。每个模块通常实现特定的功能,并且尽量减少模块之间的依赖。

  • 目标
    • 提高代码复用性。
    • 降低程序复杂性。
    • 提升代码的可维护性。

2. 在 C 中的实现

在 C 中,模块化通过 头文件.h 文件)和 源文件.c 文件)来实现。

结构:
  • 头文件(声明接口):
    包含函数声明、宏定义和必要的类型定义,供其他模块使用。
  • 源文件(实现逻辑):
    包含具体的函数实现,通常只对自己的模块开放实现细节。
示例:

math_utils.h:

#ifndef MATH_UTILS_H
#define MATH_UTILS_H

// 函数声明
int add(int a, int b);
int multiply(int a, int b);

#endif // MATH_UTILS_H

math_utils.c:

#include "math_utils.h"

// 函数实现
int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

main.c:

#include <stdio.h>
#include "math_utils.h"

int main() {
    printf("Add: %d\n", add(3, 5));
    printf("Multiply: %d\n", multiply(3, 5));
    return 0;
}
  • 关键点:通过 #include,头文件暴露接口,源文件隐藏实现细节。

3. 在 C++ 中的实现

C++ 的模块化与 C 类似,但进一步扩展,通过 命名空间 提供更强的模块化支持。

示例:

math_utils.h:

#ifndef MATH_UTILS_H
#define MATH_UTILS_H

namespace MathUtils {
    int add(int a, int b);
    int multiply(int a, int b);
}

#endif // MATH_UTILS_H

math_utils.cpp:

#include "math_utils.h"

namespace MathUtils {
    int add(int a, int b) {
        return a + b;
    }

    int multiply(int a, int b) {
        return a * b;
    }
}

main.cpp:

#include <iostream>
#include "math_utils.h"

int main() {
    std::cout << "Add: " << MathUtils::add(3, 5) << std::endl;
    std::cout << "Multiply: " << MathUtils::multiply(3, 5) << std::endl;
    return 0;
}
  • 关键点:命名空间防止名称冲突,类进一步增强代码封装能力。

二、封装

1. 概念

封装是一种将数据和操作封装在一起的机制,提供 外部可见的接口,隐藏 内部实现细节。它是面向对象编程的核心特性之一。

  • 目标
    • 隐藏数据的内部状态,防止外部非法访问。
    • 通过接口控制数据访问。
    • 提高代码的安全性和可维护性。

2. 在 C 中的封装

C 本身不是面向对象的语言,但可以通过结构体和函数的组合实现基本的封装。

示例:
#include <stdio.h>
#include <string.h>

// 封装学生信息
typedef struct {
    char name[50];
    int age;
} Student;

// 提供操作接口
void setStudent(Student *student, const char *name, int age) {
    strcpy(student->name, name);
    student->age = age;
}

void printStudent(const Student *student) {
    printf("Name: %s, Age: %d\n", student->name, student->age);
}

int main() {
    Student student;
    setStudent(&student, "Alice", 20);
    printStudent(&student);
    return 0;
}
  • 关键点:通过 setStudentprintStudent 控制对数据的访问,隐藏内部实现。

3. 在 C++ 中的封装

C++ 提供类(Class),支持更完善的封装,通过访问控制符(privateprotectedpublic)来管理访问权限。

示例:
#include <iostream>
#include <string>

class Student {
private:
    std::string name;  // 私有成员变量
    int age;

public:
    // 公共接口
    void setStudent(const std::string &name, int age) {
        this->name = name;
        this->age = age;
    }

    void printStudent() const {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

int main() {
    Student student;
    student.setStudent("Alice", 20);
    student.printStudent();
    return 0;
}
  • 关键点:使用 private 隐藏内部数据,public 提供接口。

三、C 和 C++ 的对比

特性CC++
模块化基于头文件和源文件,依赖编译器机制支持命名空间、类等更高级的模块化工具
封装借助结构体和函数组合实现,较为有限通过类实现,支持访问控制符(private 等)
接口定义使用函数声明定义接口接口可以是类的方法或命名空间的函数
实现隐藏通过不暴露源文件实现通过类和访问控制符进一步强化隐藏

四、与 Java 的对比

特性C/C++Java
模块化工具头文件(C),命名空间和类(C++)包(Package)
封装方式手动实现封装,C++ 提供更完善的机制自然支持封装,访问控制符(private 等)
实现隐藏使用接口函数隐藏实现细节类和接口提供自然隐藏

总结

  • 模块化封装 是 C 和 C++ 组织代码的基础思想,C++ 在封装上比 C 更强大,接近 Java 的特性。
  • 模块化帮助拆分程序逻辑,而封装确保数据安全。
  • 学习 C 和 C++ 的这些特性时,可借鉴 Java 的实现方式,理解异同,从而更好地掌握两种语言的编程思想和方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux glances vs top

一、安装 apt-get install glances glances top显示效果&#xff1a;

CTF知识集-PHP特性

title: CTF知识集-PHP特性 写在开头可能会用到的提示 call_user_func 调用的函数可以不区分大小写preg_match过滤存在长度溢出&#xff0c;长度超过100w检测失效。str_repeat(‘show’,250000); 生成100w个字符preg_match是无法处理数组的&#xff0c;例如:preg_match( n u m…

Hadoop运行Mapreduce问题集锦——Ubuntu虚拟机配置

一、端口访问问题 问题描述 运行任务前一直重连。具体来说&#xff0c;错误发生在尝试从czs-virtual-machine虚拟机的127.0.1.1地址连接到同一台机器的8032端口时&#xff0c;连接被拒绝。 如下&#xff1a; 2024-11-17 23:05:45,800 INFO retry.RetryInvocationHandler: java…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&#xff08;即utf8mb3&#xff09;格式&#xff0c;本文将默认字符集设置为utf8mb4&#xff0c;排序规则为utf8mb4_general_ci&#xff0c;并修改变量等类…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

TimerPickerDialog组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容固定显示为时间,它主…

大模型系列4--开源大模型本地部署到微调(WIP)

背景 一直想真正了解大模型对硬件资源的需求&#xff0c;于是准备详细看一篇视频&#xff0c;将核心要点总结记录下。本文内容参考视频&#xff1a;保姆级教程&#xff1a;6小时掌握开源大模型本地部署到微调&#xff0c;感谢up主 训练成本 训练 > 微调 > 推理训练GPT…

现代密码学总结(上篇)

现代密码学总结 &#xff08;v.1.0.0版本&#xff09;之后会更新内容 基本说明&#xff1a; ∙ \bullet ∙如果 A A A是随机算法&#xff0c; y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …

Python中opencv的一些函数及应用

Sobel 算子函数 功能&#xff1a; Sobel 算子用于计算图像的梯度&#xff08;变化率&#xff09;&#xff0c;常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分&#xff0c;特别是水平和垂直方向上的边缘。通过计算图像的梯度&#xff0c;可以…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

XDOJ 877 图的深度优先遍历

题目&#xff1a;图的深度优先遍历 问题描述 已知无向图的邻接矩阵&#xff0c;以该矩阵为基础&#xff0c;给出深度优先搜索遍历序列&#xff0c;并且给出该无向图的连通分量的个数。在遍历时&#xff0c;当有多个点可选时&#xff0c;优先选择编号小的顶点。&#xff08;即…

大屏开源项目go-view二次开发1----环境搭建(C#)

最近公司要求做一个大屏的程序用于展示公司的产品&#xff0c;我以前也没有相关的经验&#xff0c;最糟糕的是公司没有UI设计的人员&#xff0c;领导就一句话要展示公司的产品&#xff0c;具体展示的内容细节也不知道&#xff0c;全凭借自己发挥。刚开始做时是用wpf做的&#x…

摆脱B端UI框架的桎梏,首先从布局开始

在 B 端开发中&#xff0c;UI 框架虽带来便利&#xff0c;但也可能形成桎梏。要摆脱这种束缚&#xff0c;首先从布局着手是个明智之举。传统的 B 端 UI 框架布局可能较为固定&#xff0c;缺乏灵活性。我们可以尝试创新的布局方式&#xff0c;如响应式设计&#xff0c;适应不同屏…

认识异常吧

在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 异常的体系结构 1. Throwable &#xff1a; 是异常体系的顶层类&#xff0c;其派生出两个重要的子类 , Error&#xff08;错误&#xff09; 和 Exception&#xff08;异常&#xff09; 2. Error &…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道&#xff0c;Git是用来管理某一个仓库&#xff0c;那当一个项目用到了多个仓库时&#xff0c;怎么来同步管理这些仓库呢&#xff1f;这个时候就可以引入Repo管理。 Repo介绍 …

Spring Security6.3 自定义AuthorizationManager问题

项目环境&#xff1a; Springboot3.3.5, 对应的SpringFrameWork6.1&#xff0c;Security为6.3 问题&#xff1a;我想自定义AuthorizationManager接口实现类&#xff0c;在里面判断如果角色为amdin则放行请求&#xff1b; 在AdminAuthorizationManager类的check()方法中pass变量…

十二月第三周python

import tkinter as tk #安装图形窗口工具 import cv2 #处理视频工具 from tkinter import * #安装图形窗口工具 from PIL import Image, ImageTk#处理图形工具 roottk.Tk() #给工具起名字 root.title("子豪")#软件左上角名字 root.geometry("800x800500100&…

玉米叶病预测数据集,使用yolo,coco,voc格式人工标注,10046张原始图片,可识别叶枯病,普通锈病,灰叶斑病,健康的玉米叶

玉米叶病预测数据集&#xff0c;使用yolo&#xff0c;coco&#xff0c;voc格式人工标注&#xff0c;10046张原始图片&#xff0c;可识别叶枯病,普通锈病&#xff0c;灰叶斑病&#xff0c;健康的玉米叶 数据集分割 训练组87&#xff05; 8790图片 有效集4% 419图片…

NAT网络地址转化技术

1.什么是NAT NAT技术是一种将自己内网的多个私有IP地址转换为一个公网IP进行访问互联网的一项技术&#xff0c;这个技术主要是用来解决IPv4地址不够的问题。 2.NAT技术的具体例子 如果我们用手机使用流量浏览一个网站&#xff0c;那么第一步手机会对这个域名进行DNS解析&#…