自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 集群聊天服务器---MySQL数据库的建立

摘要:该数据库设计用于聊天系统,包含用户表(user)、好友关系表(friend)、群组表(AllGroup)、群组成员表(GroupUser)和离线消息表(OfflineMessage)。用户表存储账号信息,好友表记录用户关系,群组相关表管理群组信息,离线消息表保存未接收消息。同时提供了MySQL连接配置和基础操作类,包含数据库连接初始化、更新等基本功能。各表设置了适当的主键、非空和默认值约束,确保数据完整性。

2025-07-02 15:10:16 305

原创 集群聊天服务器---muduo库(3)

muduo网络库项目目录结构简明指南:包含bin、lib、include、src、build等标准目录,以及example示例和thirdparty第三方库。使用CMake构建系统(CMakeLists.txt)和自动构建脚本(autobuild.sh)。编译命令示例:g++通过-I指定头文件路径,-L指定库路径,链接muduo_net、muduo_base和pthread库。典型结构清晰,便于项目管理和跨平台编译。(98字)

2025-06-27 17:28:34 302

原创 集群聊天服务器----CMake的使用

CMake是一种跨平台的构建工具,可简化项目编译环境的配置。相比直接编写Makefile,CMake能自动生成复杂的Makefile。安装简单,Ubuntu中只需执行"sudo apt install cmake"。基本配置包括设置最低版本、项目名称、编译选项、源文件列表等。通过add_executable指定可执行文件,target_link_libraries添加依赖库。对于多源文件项目,可使用aux_source_directory自动收集源文件,或通过set命令手动指定源文件列表

2025-06-27 15:01:40 408

原创 集群聊天服务器---muduo库使用(2)

该代码实现了一个基于muduo网络库的聊天服务器。ChatServer类处理网络连接和消息,包含两个主要回调:onConnection()处理连接状态变化,onMessage()处理消息收发。服务器使用EventLoop事件循环机制,通过TcpServer管理TCP连接。main函数创建服务器实例,绑定127.0.0.1:6000端口,启动事件循环等待连接和消息处理。当收到消息时,服务器会将消息内容和接收时间打印出来,并将消息原样返回给客户端。该实现展示了muduo网络库处理网络I/O事件的基本模式,包括连

2025-06-24 22:29:21 380 1

原创 集群聊天服务器---muduo库的使用

本文介绍了使用C++和muduo网络库实现聊天服务器和客户端的设计方案。服务器端采用TcpServer类管理连接,设置10个线程处理网络事件,通过回调函数处理连接和消息事件。客户端通过TcpClient类连接服务器,同样使用回调机制处理连接和消息。文章对比了五种网络编程模型,重点分析了muduo采用的Reactor模式:主Reactor负责接收连接,子Reactor处理读写事件,通过线程池提升并发性能。该方案利用事件驱动机制有效管理高并发连接,适合现代网络应用开发需求。

2025-06-22 17:44:51 1024

原创 集群聊天项目服务器----JSON库

摘要:JSON是一种轻量级数据交换格式,具有语言独立性、易读性和高效性。JSON for Modern C++是由德国开发者nlohmann编写的C++11 JSON库,其特点包括:单头文件设计、STL兼容性、严格测试等。相比ProtoBuf和XML,JSON虽然数据压缩率较低,但使用更简便。该库支持简单的序列化操作,如直接转换STL容器为JSON字符串,并提供了dump()方法用于输出字符串格式。示例展示了如何创建JSON对象、添加数组/键值对以及序列化STL容器。

2025-06-21 15:31:34 415

原创 Linux操作系统 使用消息队列实现进程通信

消息队列是进程间通信(IPC)的一种方式,具有数据块类型区分和选择性接收的特点。系统提供了msgget()创建/获取队列,msgsnd()发送消息,msgrcv()接收消息,msgctl()控制队列等核心调用。相比管道,消息队列支持无关联进程通信,但容量有限;共享内存速度最快但需同步;信号量主要用于同步。消息队列适合小数据量传输,每个消息包含类型字段和用户定义的数据内容,接收方可按类型选择性读取。在调试多进程程序时,可使用set follow-fork-mode选择跟踪父或子进程。

2025-05-31 14:32:51 453

原创 Linux操作系统 使用共享内存实现进程通信和同步

摘要:本文介绍了使用共享内存实现进程间通信的方法,并揭示了单纯使用共享内存会导致数据同步问题。通过创建两个程序(main.c和test.c),演示了进程A将用户输入写入共享内存,进程B读取并打印数据的过程。为解决无信号量时出现的重复打印问题,文章引入信号量机制(sem.h和sem.c),使用两个信号量SEM1和SEM2实现同步控制:进程A先获取SEM1写入数据后释放SEM2,进程B获取SEM2读取数据后释放SEM1。最终实现安全的进程间通信,确保每次输入对应一次输出。

2025-05-30 21:03:11 262

原创 Linux操作系统 多进程多线程 信号量实现进程同步及共享内存

本文介绍了Linux IPC机制中进程间通信资源的管理方法。重点讲解了ipcs和ipcrm命令用于检查和清理残留的IPC资源,并通过ABC顺序输出的示例程序演示了信号量的使用。同时详细说明了共享内存的操作方法,包括创建(shmget)、映射(shmat)、断开连接(shmdt)和控制(shmctl)等函数。文中强调共享内存需要配合同步机制使用,并指出删除操作会延迟到最后一个进程断开连接时才执行。这些内容为理解和管理Linux进程间通信提供了实用指导。

2025-05-28 18:01:01 341

原创 Linux操作系统 使用信号量实现进程同步

本文通过打印机访问模拟实验展示了信号量在进程同步中的应用。当两个进程(a.c和b.c)无控制地访问共享打印机资源时,会出现错误的交替输出(如ABAB)。通过引入信号量机制(sem_init、sem_p、sem_v、sem_destroy),实现了对临界资源的互斥访问:进程A或进程B必须完整执行打印任务(AA或BB)后才能释放资源。信号量的P/V操作(原子减1/加1)确保同一时刻只有一个进程访问打印机,解决了资源竞争问题,最终输出呈现正确的成对形式(AABB)。该案例演示了二值信号量在进程同步中的典型应用。

2025-05-25 18:15:01 372

原创 集群聊天服务器学习 配置开发环境(VScode远程连接虚拟机Linux开发)(2)

本文介绍了通过VSCode配置远程Linux开发环境的完整步骤:首先在Ubuntu系统安装并启动SSH服务,确保开机自启;然后在VSCode安装Remote Development插件;接着配置SSH连接信息,包括主机名、IP地址和用户名;最后建立远程连接。连接成功后即可直接在VSCode中编辑远程Linux系统上的项目文件,操作过程中需要输入Linux登录密码进行验证。

2025-05-24 18:41:11 875

原创 Linux进程 线程 进程间通信 IPC——管道

本文介绍了进程间通信(IPC)中的管道机制,包括有名管道和无名管道两种类型。有名管道通过mkfifo命令创建,可在任意进程间通信;无名管道使用pipe()系统调用创建,主要在父子进程间通信。文章详细说明了管道的操作函数(open/close/read/write)和特点:必须同时打开读写端、无数据时read会阻塞、写端关闭时read返回0、数据仅存于内存中等。还通过C语言代码示例演示了两种管道的具体实现方式,并比较了它们的异同点,如通信范围、创建方式等。最后总结了管道的8个关键特性,包括半双工通信、异常处理

2025-05-23 22:40:34 419

原创 Linux操作系统:fork+exec进程创建

在Linux系统中,进程的创建通常通过fork和exec系列函数实现。fork用于复制当前进程,而exec则用于将当前进程替换为另一个程序。例如,执行ps -f命令时,bash会通过fork复制自身,然后使用exec将复制的进程替换为ps程序。这一过程体现了写时拷贝(Copy-on-Write)的优化,即只有在需要修改内存内容时才会进行实际复制,从而减少不必要的开销。exec系列函数(如execl、execv等)会替换当前进程的代码段、数据段等,但进程控制块(PCB)中的部分信息(如进程ID)保持不变。通常

2025-05-22 22:38:12 361

原创 Linux操作系统:信号

信号是系统响应特定条件而产生的事件,进程接收到信号后会执行相应的操作。信号的定义和存储位置通常位于系统头文件中,如/usr/include/x86_64-linux-gnu/bits/signum.h。常见的信号包括SIGINT(终端中断)、SIGKILL(强制终止进程)、SIGSEGV(无效内存访问)等,每种信号都有其特定的功能和代号。进程对信号的响应方式有三种:默认处理、忽略信号或自定义处理。例如,按下Ctrl+C会发送SIGINT信号,导致前台进程终止。通过编程,开发者可以控制进程对信号的处理方式,如

2025-05-21 22:57:49 397

原创 集群聊天服务器 项目框架(技术栈 开发目标与环境选择)(1)

本项目旨在开发一个基于C++的集群聊天系统,涵盖客户端注册、登录、好友管理、群组聊天等功能。技术栈包括Json序列化与反序列化、muduo网络库、nginx的TCP负载均衡配置、Redis缓存与消息队列、MySQL数据库编程等。项目目标为掌握网络I/O、业务与数据模块的分层设计,熟练应用C++、muduo网络库、Json编程,理解nginx负载均衡原理,实践Redis发布-订阅与消息队列,以及CMake构建与Github项目管理。开发环境为Ubuntu Linux,支持Windows+VSCode远程连接L

2025-05-20 23:00:42 241

原创 Linux僵死进程以及文件操作

僵死进程是由于子进程先于父进程结束,而父进程未获取子进程的退出码所导致的。处理僵死进程的方法包括父进程先结束或调用wait()方法获取子进程的退出码。僵死进程会消耗内存,因此应避免其产生。在Linux中,操作文件的底层系统调用包括open、read、write和close,这些调用在内核中实现。open函数用于打开或创建文件,并返回文件描述符;write和read函数分别用于写入和读取文件内容;close函数用于关闭文件描述符。文件描述符是内核为打开的文件分配的编号,标准输入、输出和错误输出分别对应0、1和

2025-05-20 21:59:25 544

原创 Linux多进程 写时拷贝 物理地址和逻辑地址

如果不采用写时拷贝技术直接fork子进程,会导致父进程的所有内存空间被完整复制到子进程,即使子进程只需要修改一小部分数据。这种复制方式不仅开销大,还会占用大量内存空间。写时拷贝技术优化了这一过程,子进程在fork时仅复制父进程的页表,共享父进程的地址空间,只有在子进程进行写入操作时,才会分配新的内存并进行复制。这种技术推迟了数据拷贝,减少了不必要的内存开销,特别适用于子进程在fork后立即执行新程序的情况。父子进程的逻辑地址相同,但物理地址可能不同,写时拷贝技术通过共享只读数据,仅在需要写入时复制数据,提高

2025-05-19 20:56:36 738

原创 Linux的高性能服务器编程 高级I/O函数总结

dup和dup2是Linux系统中用于复制文件描述符的函数,允许不同文件描述符共享同一文件。dup复制现有描述符并返回新描述符,而dup2则直接指定新描述符,若已打开则先关闭。readv和writev函数通过减少系统调用和内存拷贝提高数据传输效率,适用于处理多个小数据块。sendfile和splice函数则通过内核空间直接传输数据,减少数据复制和上下文切换,特别适合大文件或大量数据传输。fcntl函数用于控制文件描述符的属性,如文件锁定等。这些函数和工具在Linux系统编程中广泛用于提高文件操作和数据传输的

2025-05-19 01:50:46 980

原创 缓冲区的用途 和 fork复制进程

在C语言中,printf函数使用缓冲区来提高效率,减少用户态和内核态之间的频繁切换。缓冲区会在满足特定条件时刷新到屏幕上,如缓冲区满、遇到换行符\n、调用fflush(stdout)或程序结束。此外,exit函数会先刷新缓冲区再退出,而_exit则直接退出不刷新缓冲区。缓冲区的存在不仅提高了系统效率,还能协调不同设备的数据传输速度和处理错误信息。在进程管理中,fork函数用于复制进程,创建的子进程从fork调用后的代码开始执行,父子进程通过返回值区分执行不同的任务。getppid和getpid分别用于获取父

2025-05-18 19:52:04 696

原创 Linux的静态库 共享库 进程 主函数的参数

库文件是预先编译好的方法集合,Linux系统中通常存储在/lib和/usr/lib目录,头文件则在/usr/include。库分为静态库(libxxx.a)和共享库(libxxx.so)。静态库通过编译.c文件生成.o文件,再使用ar命令创建,其缺点是占用内存和磁盘空间。共享库通过gcc命令生成,使用时需指定路径和库名,但需确保库文件在标准路径下。共享库节省空间,便于升级,但依赖主机上的库文件。进程是运行中的程序,由进程控制块(PCB)管理,包含进程状态(就绪、阻塞、运行)和调度信息。

2025-05-17 17:36:52 863

原创 Linux的进程管理和用户管理

GCC与G++的主要区别在于默认链接的库和编译方式。GCC默认只链接C库,需要手动指定-lstdc++来链接C++库,而G++默认链接C++标准库。GCC根据文件后缀选择编译方式,.c文件按C语言编译,.cpp文件按C++编译;G++则无论文件后缀,都按C++语法编译。进程是运行中的程序,由操作系统通过进程控制块(PCB)管理,每个进程有唯一的进程标识符(PID)。PCB记录进程的属性信息,是进程管理和控制的关键数据结构,伴随进程的创建到撤销。

2025-05-16 00:13:11 907

原创 Linux(1)编译链接和gcc

GCC编译链接过程分为四个主要步骤:预编译、编译、汇编和链接。首先,预编译阶段处理预编译指令、删除注释并生成.i文件。接着,编译阶段进行语法、词法分析和代码优化,生成.s汇编文件。然后,汇编阶段将汇编指令翻译成二进制格式,生成.o目标文件。最后,链接阶段合并所有目标文件和库文件,生成可执行文件(如.out或.exe)。整个过程可以通过分步或一步完成,最终通过执行路径和可执行文件名运行程序。

2025-05-13 21:16:43 421

原创 C++实现 对象移动 移动语义(什么是右值引用)

移动构造函数的参数,是一个右值引用。当对象被临时创建兵立即初始化另一个对象的时候,回去调用移动构造函数。与普通构造函数不同,移动构造函数不会创建新对象的副本(不另外创建资源),而是直接使用其对象的内容,直接转移到新的对象。移动赋值运算符使用的是右值引用为参数,在这个过程中,当前对象的资源先被释放,然后“窃取”其他对象的资源,并将其他对象的资源指针设置为。这是移动语义的典型应用,用于支持异常安全的资源管理。可以被用作函数的属性,以优化程序性能,并确保异常安全。同上,他需要的参数依旧是一个右值引用。

2024-10-19 21:18:30 411

原创 C++的类和动态内存分配(深拷贝与浅拷贝)并实现自己的string类

因为我们在构造函数中,使用了new去动态创建了一个对象。(这也是为什么,一旦类中出现了指针,就需要自己定义=和拷贝构造函数,因为一定会出现浅拷贝)只有自己实现了这些功能,才会实现深拷贝。但是因为涉及到了动态分配的内存,导致两个指针指向了同一个地方,最终释放的时候,会出现同一段内存被多次释放。而深拷贝:就是使用new重新再分配一段内存,分给拷贝的对象,不让两个指针指向同一段内存,只有他们各自指向了一段内存,才不会被多次释放。区别在于,有的是临时对象,有的是直接构造,有的是动态分配了一个,然后构造。

2024-10-13 22:06:37 890

原创 C++之 友元重载 以及最常用的几种友元函数

所以C++引用了友元函数,只要加上friend关键字,C++的这个类,会自动把这个函数的权限拉到类内,这样就可以访问私有成员了。这里有人就要问了,那(类对象)+(某某);这里实际上是交换律,因为,这里类对象写的地方,并不是唯一的,可以进行交换,这种情况可以不算。话不多说,我们使用代码来进行讲解,下面先给大家展示时间类运算符重载,作为对比,我先写类内成员函数重载,再写类外友元重载,大家可以复制下来,看看。如果在定义+号的时候,实际上是并不是简单的(类对象)+(某某)亦或是(某某)+(类对象);

2024-09-30 20:21:29 797 2

原创 c++运算符重载详细笔记,有关重载的最常用的用法

c++加入了运算符重载:而实际上我们在不知不觉的情况下就已经在使用运算符重载了。就比如我们经常使用的string类,c++在string内部进行了运算符重载,他重载了+,-,<<,>>等。我们在很早之前就已经在使用了。这也是为什么c++中string类非常非常的好用!

2024-04-12 09:22:25 514 1

原创 c++的友元函数,详细笔记,细说三种友元用法

首先,了解友元函数之前,我们来想一想类内函数(成员函数)和类外函数有何区别。一,类内函数可以访问类的私有成员,并且自带一个this指针指向成员函数所指向的某一对象。二,类外函数,无法访问类的私有成员,且不带this指针。比如,如果类内的成员函数我们在调用的时候一定是:对象.函数()这样调用,这就要求了这个函数的第一个,一定是这个对象(这个知识点,我们在后面运算符重载里面讲解),而友元函数是什么?友元函数和普通的函数并无区别,也没有this指针。怎么做呢?

2024-04-10 09:10:59 457

原创 c++ 有关类的静态成员详细笔记

别名也可以叫做静态数据成员,如果一个类建立了多个对象,那么每一个对象都会有自己的数据成员。这些值呢?互不相干,很好地实现了每一个对象之间的区别也就是所谓的封装和隐藏。但在有的时候,我们希望有一些数据可以为一个类中的所有对象共有,所以c++通过静态成员变量来解决这个问题所以说,静态成员变量是类的所有对象所共有的,都可以通过自己的下标去访问这个变量。而系统也会给静态成员单独分配一个储存的空间,不挂被定义了多少个类的对象,静态成员变量的值对于每一个对象都是一样的。

2024-03-29 09:06:57 455

原创 c++之拷贝构造和赋值

其作用就是,使用一个已经创造出来的对象来初始化另一个新对象,当然我们如果不写这个函数,系统也会自动生成一个为什么也不干的拷贝构造函数,并依次把非static的成员一一拷贝到正在创建的对象当中去。如果类中出现指针,拷贝构造函数,析构函数必须自己写,否则会出现严重的错误,比如连续的释放同一处空间,或者是一个指针同时指向了两个地址。3,第一个参数必须类本身的对象的const引用,可以有其他的参数,但是必须有默认值。2,它只能有一个参数,如果有其他的,那么必须有默认值。而赋值就是,先初始化,然后被给予值。

2024-03-03 18:16:42 487

原创 c++关于this指针

每一个成员函数都有一个this指针,其中包括构造和析构俩函数。它指向的是调用的对象,可以直接使用this或者*this来使用。this指针是隐藏在每一个成员函数中的特殊指针,它指向的是所在成员对象的本身。this顾名思义,就是“这个”this:指针,指向当前的对象 ,"我" ,只能出现在类的成员函数中,一般不使用。

2024-02-13 15:02:12 545

原创 c++,类,构造函数和析构函数。他们到底有多少细节?

不论是构造函数还是析构函数都是可以在类内或者类外定义:如下class A{private:略public:A(){...这里就省略了}//这个便是构造函数的定义方式~A(){同上}//相比构造函数,为了区分析构函数,前面加一个小波浪class A{private:略public:A();~A();A::A(形参){函数体A::~A(形参){函数体1、构造函数名必须和类名一样2、构造函数没有返回值,相比之下析构函数既没有返回值,也没有参数,故不能重载。

2024-02-10 13:56:10 713

原创 c++ 类的第二章,对象的创建和使用

定义了类,相当于定义了一个数据类型。使用方法和int double是一样的,可以定义变量,数组,指针,而定以后的变量,我们把它叫做这个类的对象。之前之所以说类的用法和int double的用法一模一样,是因为就连引用的方式也是一模一样。其中的成员变量和成员函数引用都可以以相同的方式来访问。对象是通过“.”这个点来访问成员变量和成员函数的。类型名.成员函数 用来访问成员函数。类型名.成员变量 用来访问成员变量。例如:对象指针->成员变量(成员函数)通过指针来访问成员。

2024-02-09 15:22:48 643 1

原创 在c++中最重要的语法:类。第一章,什么是类,如何认识类,怎么使用类?

class A{private:成员函数或者成员属性public:成员函数或者成员属性protected:成员函数或者成员属性A是类名,自己起名字这里强调三点:1、class是声明类的关键字。class后面跟的类名首字母一定要大写2、类中包括成员属性和成员函数。成员属性代表对象的属性,成员函数代表实现对象的行为3、private,public,protected都是类中的关键字,被称为访问限定符,它规定了类中成员的访问属性,这三个关键字可以已任意顺序出现,也可以多次出现。

2024-02-08 18:51:13 589

原创 c++ 类,第一篇章,初始化列表 (详细)

第一种,是在c++11中所提出的,强烈推荐大家使用,使用{}初始化被叫做列表初始化,可以防止数据由宽变窄或者数据丢失。例如我们使用整形初始化一个浮点数,那么它会自动抛弃小数部分,把它转换为整形数,这就叫做数据丢失。但是如果我们使用初始化列表,会直接杜绝这种情况的发生,因为使用初始化列表的时候,如果出现以上情况会直接报错,不允许这种情况的出现。初始化,就是在一个变量在创建的时候被赋值,一共有四种可能。一共四种写法,如上。

2024-02-07 13:51:51 613 1

原创 超详细c++讲解,new和delete的用法,他们真的很巧妙~

雀儿给大家说一个好方法就是,我们在创建单一变量的时候,可以int *p=new int[1]{给进去需要的值}。我们创建一个容量为1的数组,来顶替单一变量,这样不管我们后续开辟多少内存,都可以只调用带中括号的delete来解决。再次强调,new和delete的属性一定要一一对应,例如new了一个数组,我们就必须使用带有中括号的delete来释放,如果new了一个变量,就是用不带中括号的delete来释放。从而释放掉我们自己开辟的内存,否则程序是永远不会的释放掉这段内存,会出现内存泄漏。

2024-02-06 15:44:46 1315 2

原创 超详细解说c++string类,c++的string怎么用,它到底有多好用?

这一块是c语言风格的字符串拷贝,其中,既需要考虑开辟的空间是否够,还需要不断地使用函数来实现。从而c++在此基础上,优化了字符串的使用。s3 = s1;s1 += s2;上面是c++风格的代码,为什么说c++字符串好用呢?因为它可以自动为你开辟合适的空间,自动为你扩充合适的空间!!这一点非常好用,完美解决了c语言字符串容易内存泄漏的问题。它添加了什么呢?

2024-02-04 23:44:29 1454 1

原创 超详细解说c++第四章,函数重载(函数多态)

可以让我们使用多个同名的函数,多态指的是多种形式的函数都可以,通常情况下我们叫它函数重载。函数重载的关键在于,函数列表的不同来让多种名字相同的函数同时存在。而同时存在的前提便是函数列表的不同 例如,参数的个数以及参数的类型之间的不同,都可以构成函数重载如图所示,四个函数名完全一样的函数在c++中完全可以这样写(这样的操作在c中是完全不行的,这也是c++比较好的一点)。这里做一个解释,什么叫做参数列表:int add;雀儿标注粗体的地方便叫做参数列表,只有参数列表有所不同,才能构成函数重载。

2024-02-03 20:30:23 694 2

原创 超详细的从零开始c++讲解,第三章。c++所增加的默认参数到底有多好用?代码注释详细讲解

在c++中允许函数拥有默认参数,也就是说,在函数定义和声明的时候,给一个参数或者多个参数指定的默认值,当一个函数有默认值的时候,就算使用的时候没有传进参数,也会直接调用默认参数进行运算。

2024-02-02 22:31:47 533

原创 超详细的从零开始 c++入门第二篇,什么是引用,怎么用引用。(超详细的解说)

从语法规则上来说指针变量是储存一个变量的地址,引用是一个实例的别名。指针变量需要分配内存,但是引用不需要。指针变量可以发生改变,可以储存不同的地址。引用再被定义的时候,就无法在改变了,只能是一个变量的引用,不能再去引用其他的变量。指针可以使空指针,但是引用可不能用空引用哦~每日金句:世上哪有什么成功,那只是努力的另一个代名词罢了。————雀儿。

2024-02-01 00:20:25 1854 1

原创 大家一起来学c++入门吧~

首先,它是面向对象的程序设计方法,从同类对象中抽象出共性,形成类。同类对象的数据原则上只能用本类提供的方法进行处理。类通过封装将接口与实现分离开来,通过接口与外界联系。

2024-01-30 22:34:15 556 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除