[{"content":"类的定义 public class box { public: int length; int width; int height; }; 这是基本的定义一个公有的访问权限的类，类的成员变量是 length、width、height。\nprivate class box { private: int length; int width; int height; }; 或者\nclass box { // class 默认是 private 的访问权限 int length; int width; int height; }; 这是基本的定义一个私有的访问权限的类，类的成员变量是 length、width、height。\nSetter void一个setter来使public使用private名\nvoid setH(int h) {height = h;} void setL(int l) {length = l;} void setW(int w) {width = w;} 方法 int V() { return length * width * height; } 调用 box b; b.setH(10); b.setL(10); b.setW(10); cout \u0026lt;\u0026lt; b.V() \u0026lt;\u0026lt; endl; 输出 1000 ","permalink":"https://xixi-cmd.github.io/posts/cpp_1/","summary":"\u003ch2 id=\"类的定义\"\u003e类的定义\u003c/h2\u003e\n\u003ch3 id=\"public\"\u003epublic\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003ebox\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这是基本的定义一个公有的访问权限的类，类的成员变量是 length、width、height。\u003c/p\u003e\n\u003ch3 id=\"private\"\u003eprivate\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003ebox\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e或者\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003ebox\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c1\"\u003e// class 默认是 private 的访问权限\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这是基本的定义一个私有的访问权限的类，类的成员变量是 length、width、height。\u003c/p\u003e\n\u003ch2 id=\"setter\"\u003eSetter\u003c/h2\u003e\n\u003cp\u003evoid一个setter来使public使用private名\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetH\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eh\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eh\u003c/span\u003e\u003cspan class=\"p\"\u003e;}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetL\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003el\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003el\u003c/span\u003e\u003cspan class=\"p\"\u003e;}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetW\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"p\"\u003e;}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"方法\"\u003e方法\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003eV\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"调用\"\u003e调用\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebox\u003c/span\u003e \u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetH\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetL\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetW\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eV\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"输出\"\u003e输出\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"关于C++的类和对象的相关笔记"},{"content":"Docker是一个开源的容器引擎，它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离，并且能将基础设施当作程序一样进行管理。使用Docker，可更快地打包、测试以及部署应用程序，并可减少从编写到部署运行代码的周期。\n准备工作 官网有详细的安装教程，然后配置下加速器即可，我这边使用阿里云的docker镜像加速器。\n基本命令 镜像命令 # 查询镜像 docker search nginx # 下载镜像 docker pull nginx # 列出镜像 docker images docker images java docker images java:8 docker images --digests docker images --filter \u0026#34;dangling=true\u0026#34; # 展示虚悬镜像 # 删除本地镜像 docker rmi hello-world docker rmi -f $(docker images) # 保存镜像 docker save busybox \u0026gt; busybox.tar docker save --output busybox.tar busybox # 加载镜像 docker load \u0026lt; busybox.tar.gz docker load --input fedora.tar # 构建镜像 docker build [OPTIONS] PATH | URL | - 容器命令 新建并启动容器[重要] 使用以下docker run 命令即可新建并启动一个容器。该命令是我们最常用的命令了，它有很多选项，下面笔者列举一些常用的选项。\n① -d选项：表示后台运行\n② -P选项：随机端口映射\n③ -p选项：指定端口映射，有以下四种格式。\nip:hostPort:containerPort\nip::containerPort\nhostPort:containerPort\ncontainerPort\n④ –network选项：指定网络模式，该选项有以下可选参数：\n–network=bridge： 默认选项，表示连接到默认的网桥。\n–network=host：容器使用宿主机的网络。\n–network=container:NAME_or_ID：告诉Docker让新建的容器使用已有容器的网络配置。\n–network=none：不配置该容器的网络，用户可自定义网络配置。\n示例1：\ndocker run java /bin/echo \u0026#39;Hello World\u0026#39; 这样终端会打印Hello World的字样，跟在本地直接执行/bin/echo 'Hello World' 一样。\n示例2：\ndocker run -d -p 91:80 nginx 这样就能启动一个Nginx容器。在本例中，我们为docker run添加了两个参数，含义如下：\n-d # 后台运行-p 宿主机端口:容器端口 # 开放容器端口到宿主机端口 访问http://Docker宿主机IP:91/\nTIPS\n需要注意的是，使用docker run命令创建容器时，会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像，Docker就会自动从Docker Hub下载镜像并启动一个Docker容器。\n列出容器[重要] 使用docker ps 命令即可列出运行中的容器。执行该命令后，可看到类似于如下的表格。\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES784fd3b294d7 nginx \u0026#34;nginx -g \u0026#39;daemon off\u0026#34; 20 minutes ago Up 2 seconds 443/tcp, 0.0.0.0:91-\u0026gt;80/tcp backstabbing_archimedes 如需列出所有容器（包括已停止的容器），可使用-a参数。\n该表格包含了七列，含义如下：\n① CONTAINER_ID：表示容器ID。\n② IMAGE：表示镜像名称。\n③ COMMAND：表示启动容器时运行的命令。\n④ CREATED：表示容器的创建时间。\n⑤ STATUS：表示容器运行的状态。Up表示运行中，Exited表示已停止。\n⑥ PORTS：表示容器对外的端口号。\n⑦ NAMES：表示容器名称。该名称默认由Docker自动生成，也可使用docker run命令的–name选项自行指定。\n命令格式：\ndocker ps [OPTIONS] 参数：\nName, shorthand Default Description --all, -a false 列出所有容器，包括未运行的容器，默认只展示运行的容器 --filter, -f 根据条件过滤显示内容 --format 通过Go语言模板文件展示镜像 --last, -n -1 显示最近创建n个容器（包含所有状态） --latest, -l false 显示最近创建的容器（包含所有状态） --no-trunc false 不截断输出 --quiet, -q false 静默模式，只展示容器的编号 --size, -s false 显示总文件大小 示例：\ndocker ps -n 5docker ps -a -q 停止容器[重要] 使用docker stop 命令，即可停止容器。\n命令格式：\ndocker stop [OPTIONS] CONTAINER [CONTAINER...] 参数：\nName, shorthand Default Description --time, -t 10 强制杀死容器前等待的时间，单位是秒 示例：\ndocker stop 784fd3b294d7 其中784fd3b294d7 是容器ID，当然也可使用docker stop 容器名称 来停止指定容器。\n强制停止容器[重要] 可使用docker kill 命令停止一个或更多运行着的容器。\n命令格式：\ndocker kill [OPTIONS] CONTAINER [CONTAINER...] 参数：\nName, shorthand Default Description --signal, -s KILL 向容器发送一个信号 例如：\ndocker kill 784fd3b294d7 启动已停止的容器[重要] 使用docker run 命令，即可新建并启动一个容器。对于已停止的容器，可使用docker start 命令来启动。\n命令格式：\ndocker start [OPTIONS] CONTAINER [CONTAINER...] 参数：\nName, shorthand Default Description --attach, -a false 连接STDOUT/STDERR并转发信号 --checkpoint 从该检查点还原 --checkpoint-dir 使用自定义的检查点存储目录 --detach-keys 覆盖断开容器的关键顺序 --interactive, -i false 连接容器的STDIN 例如：\ndocker start 784fd3b294d7 重启容器[重要] 可使用docker restart 命令来重启容器。该命令实际上是先执行了docker stop 命令，然后执行了docker start 命令。\n命令格式：\ndocker restart [OPTIONS] CONTAINER [CONTAINER...] 参数：\nName, shorthand Default Description --time, -t 10 关闭容器前等待的时间，单位是秒 进入容器[重要] 某场景下，我们可能需要进入运行中的容器。\n① 使用docker attach 命令进入容器。\n例如：\ndocker attach 784fd3b294d7 很多场景下，使用docker attach 命令并不方便。当多个窗口同时attach到同一个容器时，所有窗口都会同步显示。同理，如果某个窗口发生阻塞，其他窗口也无法执行操作。\n② 使用nsenter 进入容器\nnsenter工具包含在util-linux 2.23或更高版本中。为了连接到容器，我们需要找到容器第一个进程的PID，可通过以下命令获取：\ndocker inspect --format \u0026#34;{{.State.Pid}}\u0026#34; $CONTAINER_ID 获得PID后，就可使用nsenter命令进入容器了：\nnsenter --target \u0026#34;$PID\u0026#34; --mount --uts --ipc --net --pid 下面给出一个完整的例子：\n[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES784fd3b294d7 nginx \u0026#34;nginx -g \u0026#39;daemon off\u0026#34; 55 minutes ago Up 3 minutes 443/tcp, 0.0.0.0:91-\u0026gt;80/tcp backstabbing_archimedes[root@localhost ~]# docker inspect --format \u0026#34;{{.State.Pid}}\u0026#34; 784fd3b294d795492[root@localhost ~]# nsenter --target 95492 --mount --uts --ipc --net --pidroot@784fd3b294d7:/# 读者也可将以上两条命令封装成一个Shell，从而简化进入容器的过程。\n③ docker exec\ndocker exec -it 容器id /bin/bash 删除容器[重要] 使用docker rm 命令即可删除指定容器。\n命令格式\ndocker rm [OPTIONS] CONTAINER [CONTAINER...] 参数：\nName, shorthand Default Description --force, -f false 通过SIGKILL信号强制删除正在运行中的容器 --link, -l false 删除容器间的网络连接 --volumes, -v false 删除与容器关联的卷 例1：删除指定容器。\ndocker rm 784fd3b294d7 该命令只能删除已停止的容器，如需删除正在运行的容器，可使用-f参数。\n例2：删除所有的容器。\ndocker rm -f $(docker ps -a -q) 导出容器 将容器导出成一个压缩包文件。\n命令格式：\ndocker export [OPTIONS] CONTAINER 参数：\nName, shorthand Default Description --output, -o 将内容写到文件而非STDOUT 示例：\ndocker export red_panda \u0026gt; latest.tardocker export --output=\u0026#34;latest.tar\u0026#34; red_panda 导入容器 使用docker import 命令即可从归档文件导入内容并创建镜像。\n命令格式：\ndocker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] 参数：\nName, shorthand Default Description --change, -c 将Dockerfile指令应用到创建的镜像 --message, -m 为导入的镜像设置提交信息 示例：\ndocker import nginx2.tar nginx Dockerfile 基本指令 ADD 复制文件 ADD复制文件\n格式为：\nADD \u0026lt;src\u0026gt;... \u0026lt;dest\u0026gt; ADD [\u0026quot;\u0026lt;src\u0026gt;\u0026quot;,... \u0026quot;\u0026lt;dest\u0026gt;\u0026quot;] 从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径，也可以是一个URL，还可以是一个压缩包。\n除了要复制解压文件，一般不建议使用，使用RUN跟COPY命令就可以很好替代。\nADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar ARG 设置构建参数 设置构建参数，类似于ENV。和ENV不同的是，ARG设置的是构建时的环境变量，在容器运行时是不会存在这些变量的。\n格式为：\nARG \u0026lt;name\u0026gt;[=\u0026lt;default value\u0026gt;] ARG user1=someuser CMD 容器启动命令 用于为执行容器提供默认值。每个Dockerfile只有一个CMD命令，如果指定了多个CMD命令，那么只有最后一条会被执行，如果启动容器的时候指定了运行的命令，则会覆盖掉CMD指定的命令。\n支持三种格式：\nCMD [\u0026quot;executable\u0026quot;,\u0026quot;param1\u0026quot;,\u0026quot;param2\u0026quot;] (推荐使用，会解析成json数组，所以要记得要用双引号)\nCMD [\u0026quot;param1\u0026quot;,\u0026quot;param2\u0026quot;] (为ENTRYPOINT指令提供预设参数)\nCMD command param1 param2 (在shell中执行)\n示例：\nCMD echo \u0026#34;This is a test.\u0026#34; | wc - COPY 复制文件 复制文件，格式为：\nCOPY \u0026lt;src\u0026gt;... \u0026lt;dest\u0026gt; COPY [\u0026quot;\u0026lt;src\u0026gt;\u0026quot;,... \u0026quot;\u0026lt;dest\u0026gt;\u0026quot;] 复制本地端的src到容器的dest。COPY指令和ADD指令类似，COPY不支持URL和压缩包。\nENTRYPOINT 入口点 格式为：\nENTRYPOINT [\u0026quot;executable\u0026quot;, \u0026quot;param1\u0026quot;, \u0026quot;param2\u0026quot;] ENTRYPOINT command param1 param2 ENTRYPOINT和CMD指令的目的一样，都是指定Docker容器启动时执行的命令，可多次设置，但只有最后一个有效。ENTRYPOINT不可被重写覆盖。\nENTRYPOINT、CMD区别：http://blog.csdn.net/newjueqi/article/details/51355510\nENV 设置环境变量 用于设置环境变量，格式为：\nENV \u0026lt;key\u0026gt; \u0026lt;value\u0026gt; ENV \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; ... 示例：\nENV JAVA_HOME /path/to/java EXPOSE 声明暴露的端口 用于声明在运行时容器提供服务的端口，格式为：\nEXPOSE \u0026lt;port\u0026gt; [\u0026lt;port\u0026gt;...] 需要注意的是，这只是一个声明，运行时并不会因为该声明就打开相应端口。该指令的作用主要是帮助镜像使用者理解该镜像服务的守护端口；其次是当运行时使用随机映射时，会自动映射EXPOSE的端口。示例：\n# 声明暴露一个端口示例 EXPOSE port1 # 相应的运行容器使用的命令 docker run -p port1 image # 也可使用-P选项启动 docker run -P image # 声明暴露多个端口示例 EXPOSE port1 port2 port3 # 相应的运行容器使用的命令 docker run -p port1 -p port2 -p port3 image # 也可指定需要映射到宿主机器上的端口号 docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image FROM 指定基础镜像 指定基础镜像，FROM指令有点像Java里面的extend关键字。需要注意的是，FROM指令必须指定且需要写在其他指令之前。FROM指令后的所有指令都依赖于该指令所指定的镜像。\n支持三种格式：\nFROM \u0026lt;image\u0026gt; FROM \u0026lt;image\u0026gt;:\u0026lt;tag\u0026gt; FROM \u0026lt;image\u0026gt;@\u0026lt;digest\u0026gt; LABEL 为镜像添加元数据 为镜像添加元数据。\n格式为：\nLABEL \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; ... 示例：\nLABEL \u0026#34;com.example.vendor\u0026#34;=\u0026#34;ACME Incorporated\u0026#34; LABEL com.example.label-with-value=\u0026#34;foo\u0026#34; LABEL version=\u0026#34;1.0\u0026#34; LABEL description=\u0026#34;This text illustrates \\that label-values can span multiple lines.\u0026#34; MAINTAINER 指定维护者的信息（已过时） MAINTAINER指令用于指定维护者的信息，用于为Dockerfile署名。\n格式为：\nMAINTAINER \u0026lt;name\u0026gt; 示例：\nMAINTAINER 周立\u0026lt;eacdy0000@126.com\u0026gt; 注：该指令已过时，建议使用如下形式：\nLABEL maintainer=\u0026#34;SvenDowideit@home.org.au\u0026#34; RUN 执行命令 该指令支持两种格式：\nRUN \u0026lt;command\u0026gt; RUN [\u0026quot;executable\u0026quot;, \u0026quot;param1\u0026quot;, \u0026quot;param2\u0026quot;] RUN \u0026lt;command\u0026gt; 在shell终端中运行，在Linux中默认是/bin/sh -c ，在Windows中是 cmd /s /c，使用这种格式，就像直接在命令行中输入命令一样。 RUN [\u0026quot;executable\u0026quot;, \u0026quot;param1\u0026quot;, \u0026quot;param2\u0026quot;] 使用exec执行，这种方式类似于函数调用。指定其他终端可以通过该方式操作，例如：RUN [\u0026quot;/bin/bash\u0026quot;, \u0026quot;-c\u0026quot;, \u0026quot;echo hello\u0026quot;] ，该方式必须使用双引号[“]而不能使用单引号[‘]，因为该方式会被转换成一个JSON 数组。\nUSER 设置用户 该指令用于设置启动镜像时的用户或者UID，写在该指令后的RUN、CMD以及ENTRYPOINT指令都将使用该用户执行命令。\n格式为：\nUSER 用户名 示例：\nUSER daemon VOLUME 指定挂载点 该指令使容器中的一个目录具有持久化存储的功能，该目录可被容器本身使用，也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。格式为：\nVOLUME [\u0026quot;/data\u0026quot;] 示例：\nVOLUME /data 使用示例：\nFROM nginxVOLUME /tmp 当该Dockerfile被构建成镜像后，/tmp目录中的数据即使容器关闭也依然存在。如果另一个容器也有持久化的需求，并且想使用以上容器/tmp目录中的内容，则可使用如下命令启动容器：\ndocker run -volume-from 容器ID 镜像名称 # 容器ID是di一个容器的ID，镜像是第二个容器所使用的镜像。 WORKDIR 指定工作目录 格式为：\nWORKDIR /path/to/workdir 切换目录指令，类似于cd命令，写在该指令后的RUN，CMD以及ENTRYPOINT指令都将该目录作为当前目录，并执行相应的命令。\n其他 Dockerfile还有一些其他的指令，例如STOPSINGAL、HEALTHCHECK、SHELL等。由于并不是很常用，本书不作赘述。有兴趣的读者可前往https://docs.docker.com/engine/reference/builder/ 扩展阅读。\nCMD/ENTRYPOINT/RUN区别\n参考：https://segmentfault.com/q/1010000000417103\n实战 相关链接 Docker官方网站\nDocker GitHub\nDocker 入门到实践\n","permalink":"https://xixi-cmd.github.io/posts/docker_1/","summary":"\u003cp\u003eDocker是一个开源的\u003cstrong\u003e容器引擎\u003c/strong\u003e，它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离，并且能将基础设施当作程序一样进行管理。使用Docker，可更快地打包、测试以及部署应用程序，并可\u003cstrong\u003e减少从编写到部署运行代码的周期\u003c/strong\u003e。\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003ch3 id=\"准备工作\"\u003e准备工作\u003c/h3\u003e\n\u003cp\u003e官网有详细的安装教程，然后配置下加速器即可，我这边使用\u003ca href=\"https://cr.console.aliyun.com/cn-qingdao/instances/mirrors\"\u003e阿里云的\u003ccode\u003edocker\u003c/code\u003e镜像加速器\u003c/a\u003e。\u003c/p\u003e\n\u003ch3 id=\"基本命令\"\u003e基本命令\u003c/h3\u003e\n\u003ch4 id=\"镜像命令\"\u003e镜像命令\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 查询镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker search nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 下载镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 列出镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images java\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images java:8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images --digests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images --filter \u003cspan class=\"s2\"\u003e\u0026#34;dangling=true\u0026#34;\u003c/span\u003e   \u003cspan class=\"c1\"\u003e# 展示虚悬镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 删除本地镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker rmi hello-world\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker rmi -f \u003cspan class=\"k\"\u003e$(\u003c/span\u003edocker images\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 保存镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker save busybox \u0026gt; busybox.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker save --output busybox.tar busybox\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 加载镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker load \u0026lt; busybox.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker load --input fedora.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 构建镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build \u003cspan class=\"o\"\u003e[\u003c/span\u003eOPTIONS\u003cspan class=\"o\"\u003e]\u003c/span\u003e PATH \u003cspan class=\"p\"\u003e|\u003c/span\u003e URL \u003cspan class=\"p\"\u003e|\u003c/span\u003e -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"容器命令\"\u003e容器命令\u003c/h4\u003e\n\u003ch5 id=\"新建并启动容器重要\"\u003e新建并启动容器[重要]\u003c/h5\u003e\n\u003cp\u003e使用以下\u003ccode\u003edocker run\u003c/code\u003e 命令即可新建并启动一个容器。该命令是我们最常用的命令了，它有很多选项，下面笔者列举一些常用的选项。\u003c/p\u003e","title":"docker初探"},{"content":"Water 最近尝试了一下linux,绝对不是一因为windows太卡了，我装的是arch衍生的CachyOS，我相信很多人用的都是Ubuntu，其实也大差不差的\n正题 Bash（全称是 Bourne Again Shell）是运行在今天的大多数 Linux 发行版上的默认的 shell，它非常受欢迎，并具有很多功能。但是容易抽风，所以我选择Fish\n安装Fish 在 Arch Linux 上安装 Fish shell 很简单，只需要运行以下命令即可：\nsudo pacman -S fish 对于 Ubuntu 16.04/18.04 系统来说，请使用 APT-GET 命令 或者 APT 命令 安装 fish shell。\nsudo apt-add-repository ppa:fish-shell/release-3 sudo apt-get update sudo apt-get install fish 对于 Fedora 23+ 系统来说，请使用 DNF 命令 安装 fish shell。\nsudo dnf config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/shells:fish:release:3.repo sudo dnf install fish 使用和配置 使用 安装完成以后在终端输入fish并且回车就可以使用Fish了\n配置成默认的终端环境 Shell命令更改 要将 Fish 设置为 CachyOS 的默认 Shell，最核心的方法是使用 chsh 命令。\n这里有一个需要留意的细节：修改后可能需要重启系统才能生效，单纯的注销再登录可能没有效果\n首先我们要先找到你安装的fish在哪里，使用这个命令\ncommand -v fish 输出可能是/usr/bin/fish，当然也可能是别的，我的是这个，然后执行chash命令\nchsh -s /usr/bin/fish 系统会提示你输入当前用户的密码。命令执行后，通常不会有成功提示，这是正常现象 然后输入reboot重启电脑，再打开你的terminal就是fish了\n图形化 这个是有一个前提的，你用的的是KDE+Konsole\n打开 Konsole。 点击菜单栏的 设置 (Settings) -\u0026gt; 配置 Konsole (Configure Konsole)。 在左侧选择 配置文件 (Profiles)。 选中你正在使用的配置文件（通常是默认的 \u0026ldquo;Shell\u0026rdquo;），点击 编辑 (Edit)。 在 命令 (Command) 一栏中，将默认的 Shell 路径修改为 /usr/bin/fish。 保存即可。之后通过 Konsole 打开的终端都会使用 Fish，但系统登录 Shell 仍可能未变 美化（可选） Starship美化的部分太少了，其实是不对我的审美，也可以选择这个的，我这里提一嘴\nStarship Arch用户可以使用下面的命令安装starship\nparu -S starship 或者是使用所有发行版都能用的\ncurl -sS https://starship.rs/install.sh | sh 下载完成以后就可以使用下面这个来在对应的shell里面添加初始化的命令\necho \u0026#39;starship init fish | source\u0026#39; \u0026gt;\u0026gt; ~/.config/fish/config.fish Oh-My-Posh 在诸多的美化选择里，Oh-My-Posh自然是主题最多的，也是最符合我的审美的一个了，下面我们来安装和配置它\n安装 首先我们用下面的命令来安装一下\ncurl -s https://ohmyposh.dev/install.sh | bash -s 或者你可能喜欢用wget\nwget -qO- https://ohmyposh.dev/install.sh | bash -s 安装脚本会自动检测系统架构，将 oh-my-posh 安装到 /usr/local/bin。\n安装完成后验证：\noh-my-posh --version 配置 配置的话我们需要在刚才安装的fish的config.fish文件里添加下面这个内容\noh-my-posh init fish --config ~/jandedobbeleer.omp.json | source 然后重新加载一下你的配置\nsource ~/.config/fish/config.fish 之后下一步是配置主题\n# 创建主题目录 因为没自带，挺牛的 mkdir -p ~/.poshthemes # 下载所有官方主题 wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/themes.zip -O ~/.poshthemes/themes.zip # 解压 unzip ~/.poshthemes/themes.zip -d ~/.poshthemes 看到刚才在配置文件里加的那一行的这一段了吗~/jandedobbeleer.omp.json | source，里面的jandedobbeleer就是你选的主题名字，主题目录和具体展示可以去官网的主题页面看, 我个人比较喜欢jandedobbeleer这个主题，按自己的喜好来就行，改了以后重启一下终端或者source ~/.config/fish/config.fish就行\n总结 通过以上步骤，你将拥有一个视觉舒适、信息明确的终端环境。Fish 带来了开箱即用的智能补全和语法高亮，Oh My Posh 则让提示符变得清晰而美观。两者结合，能显著提升日常命令行操作的效率和愉悦感。\n","permalink":"https://xixi-cmd.github.io/posts/linux_1/","summary":"\u003ch1 id=\"water\"\u003eWater\u003c/h1\u003e\n\u003cp\u003e最近尝试了一下linux,绝对不是一因为windows太卡了，我装的是arch衍生的CachyOS，我相信很多人用的都是Ubuntu，其实也大差不差的\u003c/p\u003e\n\u003ch1 id=\"正题\"\u003e正题\u003c/h1\u003e\n\u003cp\u003eBash（全称是 Bourne Again Shell）是运行在今天的大多数 Linux 发行版上的默认的 shell，它非常受欢迎，并具有很多功能。但是容易抽风，所以我选择Fish\u003c/p\u003e\n\u003ch2 id=\"安装fish\"\u003e安装Fish\u003c/h2\u003e\n\u003cp\u003e在 Arch Linux 上安装 Fish shell 很简单，只需要运行以下命令即可：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S fish\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对于 Ubuntu 16.04/18.04 系统来说，请使用 APT-GET 命令 或者 APT 命令 安装 fish shell。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-add-repository ppa:fish-shell/release-3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install fish\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对于 Fedora 23+ 系统来说，请使用 DNF 命令 安装 fish shell。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo dnf config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/shells:fish:release:3.repo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo dnf install fish\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"使用和配置\"\u003e使用和配置\u003c/h2\u003e\n\u003ch3 id=\"使用\"\u003e使用\u003c/h3\u003e\n\u003cp\u003e安装完成以后在终端输入\u003ccode\u003efish\u003c/code\u003e并且回车就可以使用Fish了\u003c/p\u003e\n\u003ch3 id=\"配置成默认的终端环境\"\u003e配置成默认的终端环境\u003c/h3\u003e\n\u003ch4 id=\"shell命令更改\"\u003eShell命令更改\u003c/h4\u003e\n\u003cp\u003e要将 Fish 设置为 CachyOS 的默认 Shell，最核心的方法是使用 chsh 命令。\u003c/p\u003e","title":"linux终端美化"},{"content":"Water 因为我开学了，刚好学到了，琢磨了一下，有点理解，然后水一篇，应该没什么人看~\n正题 在C++里，面向对象只和一个叫class的关键字有关系\n例如 #include \u0026lt;string\u0026gt; class student() { private: string name; // 神了这里居然没变色 int age; int score; public: ... ... }; 上面这段代码就是利用class关键字来创建了一个名为student的对象，这个对象中的私有变量private包含了name，age，score这三个变量，私有变量就类似于一个可以随时更改的值，你只需要把你想要的值写入，就可以直接替换这三个私有变量代表的值，只需要写在主函数中\nlass student { private: // 私有成员变量 string name; int age; int score; public: // 函数 student(string n,int a, int s) { name = n; age = a; score = s; } void info() { cout \u0026lt;\u0026lt; \u0026#34;NAME \u0026#34; \u0026lt;\u0026lt; name \u0026lt;\u0026lt; endl; cout \u0026lt;\u0026lt; \u0026#34;AGE \u0026#34; \u0026lt;\u0026lt; age \u0026lt;\u0026lt; endl; cout \u0026lt;\u0026lt; \u0026#34;SCORE \u0026#34; \u0026lt;\u0026lt; score \u0026lt;\u0026lt; endl; } void set_score(int s) { if (s \u0026gt;= 0 \u0026amp;\u0026amp; s \u0026lt;= 100) { score = s; } else { cout \u0026lt;\u0026lt; \u0026#34;ERROR！！！\u0026#34;\u0026lt;\u0026lt; endl; } } int get_score() { return score; } }; int main() { student stu1(\u0026#34;LiMing\u0026#34;, 20, 50); // 看这里！ cout \u0026lt;\u0026lt; \u0026#34;INFO:\\n\u0026#34;; stu1.info(); } 说人话就是，你可以在class里定义一个变量，就和在主函数中直接定义一样，但是可以直接在主函数中赋值给这些私有变量\n面对两个象 面向对象可以理解为，你要干什么都可以直接在你写的class里面找，例如我把三角新的周长公式和三角形的面积公式同时写到public里，就可以直接在主函数里为三角形的三边赋值然后一对二进行输出两个内容\n#inclde \u0026lt;math.h\u0026gt; #inclde \u0026lt;iostream\u0026gt; class math { private: int side_1; int side_2; int side_3; public: math(int s1,int s2,int s3) { side_1 = s1; side_2 = s2; side_3 = s3; } int triaArea() { int area; int p; p = (side_1 + side_2 + side_3)/2; area = (p*(p - side_1)*(p - side_2)*(p - side_3)); return sqrt(area); } int triaLength() { int length; length = side_1 + side_2 + side_3; return length; } }; int main() { math Gra2(3,4,5); // 面向三角形 int area = Gra2.triaArea(); int length_t = Gra2.triaLength(); std::cout \u0026lt;\u0026lt; area \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; length_t \u0026lt;\u0026lt; std::endl; } 总结 所以面向对象可以理解为 1.数据+功能 = 类 (private + public = class) 2.用类创造的叫对象 (class student = 创建对象) 2.对象封装，只留接口(side_1/2/3和name,score,age的变量名都是不可以更改的，但是参数是可以改的，参数就是接口) 4.多合一，一个类可以处理很多事情(area + length = class) 5.管理方便，逻辑清晰，看着舒服\n希望我的文章可以让你可以更加简单地理解面向对象是什么东东，不懂评论区留言问我，一起进步，给你解惑的过程我也学到东西了~\n","permalink":"https://xixi-cmd.github.io/posts/cpp_2/","summary":"\u003ch1 id=\"water\"\u003eWater\u003c/h1\u003e\n\u003cp\u003e因为我开学了，刚好学到了，琢磨了一下，有点理解，然后水一篇，应该没什么人看~\u003c/p\u003e\n\u003ch1 id=\"正题\"\u003e正题\u003c/h1\u003e\n\u003cp\u003e在C++里，面向对象只和一个叫class的关键字有关系\u003c/p\u003e\n\u003ch2 id=\"例如\"\u003e例如\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;string\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nf\"\u003estudent\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 神了这里居然没变色\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e...\u003c/span\u003e \u003cspan class=\"p\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e上面这段代码就是利用class关键字来创建了一个名为student的对象，这个对象中的私有变量private包含了name，age，score这三个变量，私有变量就类似于一个可以随时更改的值，你只需要把你想要的值写入，就可以直接替换这三个私有变量代表的值，只需要写在主函数中\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elass\u003c/span\u003e \u003cspan class=\"n\"\u003estudent\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 私有成员变量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 函数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estudent\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;NAME \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;AGE \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SCORE \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eset_score\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;ERROR！！！\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_score\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estudent\u003c/span\u003e \u003cspan class=\"n\"\u003estu1\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;LiMing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 看这里！\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;INFO:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estu1\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e说人话就是，你可以在class里定义一个变量，就和在主函数中直接定义一样，但是可以直接在主函数中赋值给这些私有变量\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"面对两个象\"\u003e面对两个象\u003c/h2\u003e\n\u003cp\u003e面向对象可以理解为，你要干什么都可以直接在你写的class里面找，例如我把三角新的周长公式和三角形的面积公式同时写到public里，就可以直接在主函数里为三角形的三边赋值然后一对二进行输出两个内容\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#inclde \u0026lt;math.h\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#inclde \u0026lt;iostream\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003emath\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eside_1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eside_2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eside_3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003es1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003es3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eside_1\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eside_2\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eside_3\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003etriaArea\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003earea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eside_1\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eside_2\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eside_3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003earea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eside_1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eside_2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eside_3\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esqrt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003etriaLength\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eside_1\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eside_2\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eside_3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emath\u003c/span\u003e \u003cspan class=\"n\"\u003eGra2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 面向三角形\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003earea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGra2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etriaArea\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elength_t\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGra2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etriaLength\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003earea\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003elength_t\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch1 id=\"总结\"\u003e总结\u003c/h1\u003e\n\u003cp\u003e所以面向对象可以理解为\n1.数据+功能 = 类 (private + public = class)\n2.用类创造的叫对象 (class student = 创建对象)\n2.对象封装，只留接口(side_1/2/3和name,score,age的变量名都是不可以更改的，但是参数是可以改的，参数就是接口)\n4.多合一，一个类可以处理很多事情(area + length = class)\n5.管理方便，逻辑清晰，看着舒服\u003c/p\u003e","title":"浅谈C++的面向对象"},{"content":"👋 你好，我是 ChenShang 一名正在探索编程世界的大一计算机专业学生。\n💻 技术栈 C++ - 探索底层与性能的奥秘 Python - 感受简洁与高效的魅力 Web 前端 - 用代码构建可视化的美好 🥤 热爱与日常 快乐源泉：肥宅快乐水（可乐），写代码时的最佳伴侣 运动习惯：喜欢跳绳，但上了大学以后就没怎么运动过了 😅 日常吐槽：特别讨厌大学的数学课（懂的都懂） 🚀 关于博客 这个博客是我记录学习过程、分享技术心得的地方。希望能在这里：\n分享 C++/Python/前端的学习笔记 记录项目开发中的坑与收获 与更多热爱编程的朋友交流 📫 联系我 GitHub: xixi-cmd X/Twitter: @LiLiyawen 努力学习，早日成为大佬！💪\n","permalink":"https://xixi-cmd.github.io/about/","summary":"\u003ch2 id=\"-你好我是-chenshang\"\u003e👋 你好，我是 ChenShang\u003c/h2\u003e\n\u003cp\u003e一名正在探索编程世界的大一计算机专业学生。\u003c/p\u003e\n\u003ch2 id=\"-技术栈\"\u003e💻 技术栈\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eC++\u003c/strong\u003e - 探索底层与性能的奥秘\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePython\u003c/strong\u003e - 感受简洁与高效的魅力\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWeb 前端\u003c/strong\u003e - 用代码构建可视化的美好\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"-热爱与日常\"\u003e🥤 热爱与日常\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e快乐源泉\u003c/strong\u003e：肥宅快乐水（可乐），写代码时的最佳伴侣\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e运动习惯\u003c/strong\u003e：喜欢跳绳，但上了大学以后就没怎么运动过了 😅\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e日常吐槽\u003c/strong\u003e：特别讨厌大学的数学课（懂的都懂）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"-关于博客\"\u003e🚀 关于博客\u003c/h2\u003e\n\u003cp\u003e这个博客是我记录学习过程、分享技术心得的地方。希望能在这里：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e分享 C++/Python/前端的学习笔记\u003c/li\u003e\n\u003cli\u003e记录项目开发中的坑与收获\u003c/li\u003e\n\u003cli\u003e与更多热爱编程的朋友交流\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"-联系我\"\u003e📫 联系我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub: \u003ca href=\"https://github.com/xixi-cmd\"\u003exixi-cmd\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eX/Twitter: \u003ca href=\"https://x.com/LiLiyawen\"\u003e@LiLiyawen\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cblockquote\u003e\n\u003cp\u003e努力学习，早日成为大佬！💪\u003c/p\u003e\n\u003c/blockquote\u003e","title":"关于我"},{"content":"Rust 简介 实际上自己接触 Rust 的时间还是很有限的，这里也不会对 Rust 进行长篇大论地介绍，简单来说，Rust 是一个性能和 c++ 相近的系统级编程语言，同时，由于其所有权与变量生命周期等机制的设计，使其相对于 c++ 来说拥有内存安全的优势，几乎不会出现诸如悬垂指针、数组越界、段错误等问题，在微软、百度、字节跳动等公司均有所使用。\n关于 Rust 的特性以及未来，知乎这个问题中的一些高赞回答以及相关的评论，非常值得一看。\n本文会以二叉树这样一个具体的例子出发，来对 Rust 的一部分知识内容进行学习。\n实现二叉树数据结构 定义结构 之前在 Javascript 等语言中，我们只要对对象有所了解，实现一个二叉树的数据结构是非常简单的事情，而在 Rust 中，可能对于新手来说仅仅是实现基本的数据结构就是一个比较脑壳疼的事情。\n我们一般会写出类似这样的代码：\nstruct Tree { value: i32, left: Tree, // 直接使用 Tree 是不行的 right: Tree } 自然不会通过 Rust 的编译检查，会报错例如：recursive type has infinite size，不过其同时给我们提供了解决方案，这里我们使用 Box\u0026lt;T\u0026gt; 指针。\n另外，考虑到二叉树的左右子树可能为空，所以这里我们还需要增加一个 Option。\n最终我们的二叉树数据结构定义如下：\n#[derive(Debug, Default)] struct Tree { value: i32, left: Option\u0026lt;Box\u0026lt;Tree\u0026gt;\u0026gt;, right: Option\u0026lt;Box\u0026lt;Tree\u0026gt;\u0026gt; } 实现基本的方法 这里我们实现一些二叉树的基本的方法，作为上述结构体的方法，我们将实现以下方法：\n获取二叉树节点的值（其实也可以没有这个方法）。 修改二叉树节点的值。 设置子树。 删除子树。 这里除了第一个，其余我们都需要传递 self 的可变引用，我们的实现如下：\nimpl Tree { fn get_val(\u0026amp;self) -\u0026gt; i32 { return self.value; } fn set_val(\u0026amp;mut self, val: i32) -\u0026gt; i32 { self.value = val; return self.value; } fn insert(\u0026amp;mut self, dir: \u0026amp;String, val: Tree) { assert!(dir == \u0026#34;left\u0026#34; || dir == \u0026#34;right\u0026#34;); match dir.as_ref() { \u0026#34;left\u0026#34; =\u0026gt; self.left = Some(Box::new(val)), \u0026#34;right\u0026#34; =\u0026gt; self.right = Some(Box::new(val)), _ =\u0026gt; { println!(\u0026#34;Insert Error: only left and right supported\u0026#34;); process::exit(1); } } } fn delete(\u0026amp;mut self, dir: \u0026amp;String) { assert!(dir == \u0026#34;left\u0026#34; || dir == \u0026#34;right\u0026#34;); match dir.as_ref() { \u0026#34;left\u0026#34; =\u0026gt; self.left = None, \u0026#34;right\u0026#34; =\u0026gt; self.right = None, _ =\u0026gt; { println!(\u0026#34;Insert Error: only left and right supported\u0026#34;); process::exit(1); } } } } 遍历二叉树 这里遍历二叉树我们作为一个单独的方法，而不是属性方法来实现，这样会更符合我们平时的业务场景，这里其实问题比较多的，我们先简易实现一个版本：\nfn traverse(tree: Tree) { println!(\u0026#34;Node Value: {:?}\u0026#34;, tree.value); if tree.left.is_some() { traverse(*tree.left.unwrap()); // 手动解引用 } if tree.right.is_some() { traverse(*tree.right.unwrap()); // 手动解引用 } } 如果我们测试一下这个版本，发现的确能够正常遍历的，但是实际上这有一个致命的问题：\n这里采用的是所有权的移动，而不是不可变借用，这会导致我们的函数执行完后原来变量的所有权已经被移动了，换一种说法则是会消耗掉这个变量，这显然不是我们预期的。\n虽然我们也可以在函数中返回 tree 的方式来最后再次移动所有权，但这样非常不便于实现，经过重构，我们采用了如下的方式实现：\nfn traverse(tree: \u0026amp;Tree) { println!(\u0026#34;Node Value: {:?}\u0026#34;, tree.value); match tree.left { Some(ref x) =\u0026gt; traverse(x), _ =\u0026gt; {} } match tree.right { Some(ref x) =\u0026gt; traverse(x), _ =\u0026gt; {} } } 另外一个注意点则是由于 unwrap() 本身是一个消耗性操作，我们这里不能使用 unwrap，参考stackOverflow的提问1、stackOverflow的提问2。\n我们最终的完整代码如下：\nuse::std::process; use std::borrow::Borrow; #[derive(Debug, Default)] struct Tree { value: i32, left: Option\u0026lt;Box\u0026lt;Tree\u0026gt;\u0026gt;, right: Option\u0026lt;Box\u0026lt;Tree\u0026gt;\u0026gt; } impl Tree { fn get_val(\u0026amp;self) -\u0026gt; i32 { return self.value; } fn set_val(\u0026amp;mut self, val: i32) -\u0026gt; i32 { self.value = val; return self.value; } fn insert(\u0026amp;mut self, dir: \u0026amp;String, val: Tree) { assert!(dir == \u0026#34;left\u0026#34; || dir == \u0026#34;right\u0026#34;); match dir.as_ref() { \u0026#34;left\u0026#34; =\u0026gt; self.left = Some(Box::new(val)), \u0026#34;right\u0026#34; =\u0026gt; self.right = Some(Box::new(val)), _ =\u0026gt; { println!(\u0026#34;Insert Error: only left and right supported\u0026#34;); process::exit(1); } } } fn delete(\u0026amp;mut self, dir: \u0026amp;String) { assert!(dir == \u0026#34;left\u0026#34; || dir == \u0026#34;right\u0026#34;); match dir.as_ref() { \u0026#34;left\u0026#34; =\u0026gt; self.left = None, \u0026#34;right\u0026#34; =\u0026gt; self.right = None, _ =\u0026gt; { println!(\u0026#34;Insert Error: only left and right supported\u0026#34;); process::exit(1); } } } } // 原始的非消耗性遍历: // fn traverse(tree: \u0026amp;Tree) { // println!(\u0026#34;Node Value: {:?}\u0026#34;, tree.value); // if tree.left.is_some() { // // cannot move out of borrowed content // // 首先 unwrap 是一个消耗性操作 // // 这是由于 unwrap 函数造成? as_ref 也不行 // traverse((tree.left.as_ref().map(|x| **x).unwrap()).borrow()); // } // // if tree.right.is_some() { // // // cannot move out of borrowed content // // traverse(tree.right.unwrap().borrow()); // // } // } // 非消耗性遍历 fn traverse(tree: \u0026amp;Tree) { println!(\u0026#34;Node Value: {:?}\u0026#34;, tree.value); match tree.left { Some(ref x) =\u0026gt; traverse(x), _ =\u0026gt; {} } match tree.right { Some(ref x) =\u0026gt; traverse(x), _ =\u0026gt; {} } } // 消耗性遍历： // fn traverse(tree: Tree) { // println!(\u0026#34;Node Value: {:?}\u0026#34;, tree.value); // if tree.left.is_some() { // traverse(*tree.left.unwrap()); // 手动解引用 // } // if tree.right.is_some() { // traverse(*tree.right.unwrap()); // 手动解引用 // } // } fn main() { println!(\u0026#34;begin rust tree test:\u0026#34;); let mut tree = Tree { value : 12, ..Default::default() }; let mut left = Tree { value : 121, ..Default::default() }; tree.insert(\u0026amp;String::from(\u0026#34;left\u0026#34;), left); let mut right = Tree { value : 122, ..Default::default() }; tree.insert(\u0026amp;String::from(\u0026#34;right\u0026#34;), right); // tree.delete(\u0026amp;String::from(\u0026#34;right\u0026#34;)); // println!(\u0026#34;Tree val: {:?}\u0026#34;, left.get_val()); 不能这样写，所有权已经被移动 traverse(\u0026amp;tree); // traverse(tree); } ","permalink":"https://xixi-cmd.github.io/posts/rust_1/","summary":"\u003ch3 id=\"rust-简介\"\u003eRust 简介\u003c/h3\u003e\n\u003cp\u003e实际上自己接触 Rust 的时间还是很有限的，这里也不会对 Rust 进行长篇大论地介绍，简单来说，Rust 是一个性能和 c++ 相近的系统级编程语言，同时，由于其所有权与变量生命周期等机制的设计，使其相对于 c++ 来说拥有内存安全的优势，几乎不会出现诸如悬垂指针、数组越界、段错误等问题，在微软、百度、字节跳动等公司均有所使用。\u003c/p\u003e\n\u003cp\u003e关于 Rust 的特性以及未来，知乎\u003ca href=\"https://www.zhihu.com/question/30407715\"\u003e这个问题中的一些高赞回答以及相关的评论\u003c/a\u003e，非常值得一看。\u003c/p\u003e\n\u003cp\u003e本文会以二叉树这样一个具体的例子出发，来对 Rust 的一部分知识内容进行学习。\u003c/p\u003e\n\u003ch3 id=\"实现二叉树数据结构\"\u003e实现二叉树数据结构\u003c/h3\u003e\n\u003ch4 id=\"定义结构\"\u003e定义结构\u003c/h4\u003e\n\u003cp\u003e之前在 Javascript 等语言中，我们只要对对象有所了解，实现一个二叉树的数据结构是非常简单的事情，而在 Rust 中，可能对于新手来说仅仅是实现基本的数据结构就是一个比较脑壳疼的事情。\u003c/p\u003e\n\u003cp\u003e我们一般会写出类似这样的代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eTree\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e: \u003cspan class=\"kt\"\u003ei32\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e: \u003cspan class=\"nc\"\u003eTree\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 直接使用 Tree 是不行的\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e: \u003cspan class=\"nc\"\u003eTree\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e自然不会通过 Rust 的编译检查，会报错例如：\u003ccode\u003erecursive type has infinite size\u003c/code\u003e，不过其同时给我们提供了解决方案，这里我们使用 \u003ccode\u003eBox\u0026lt;T\u0026gt;\u003c/code\u003e 指针。\u003c/p\u003e\n\u003cp\u003e另外，考虑到二叉树的左右子树可能为空，所以这里我们还需要增加一个 \u003ccode\u003eOption\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e最终我们的二叉树数据结构定义如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#[derive(Debug, Default)]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eTree\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e: \u003cspan class=\"kt\"\u003ei32\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e: \u003cspan class=\"nb\"\u003eOption\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eBox\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eTree\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e: \u003cspan class=\"nb\"\u003eOption\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eBox\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eTree\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e   \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"实现基本的方法\"\u003e实现基本的方法\u003c/h4\u003e\n\u003cp\u003e这里我们实现一些二叉树的基本的方法，作为上述结构体的方法，我们将实现以下方法：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e获取二叉树节点的值（其实也可以没有这个方法）。\u003c/li\u003e\n\u003cli\u003e修改二叉树节点的值。\u003c/li\u003e\n\u003cli\u003e设置子树。\u003c/li\u003e\n\u003cli\u003e删除子树。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里除了第一个，其余我们都需要传递 \u003ccode\u003eself\u003c/code\u003e 的可变引用，我们的实现如下：\u003c/p\u003e","title":"Rust初探——二叉树的增减和遍历"},{"content":" Linux 说起Linux，你一定会联想到一只傻傻的企鹅坐在空气上。\n就在快要过去的2020年，linux29岁了。对29了。很明显，我这次文章的目的不是为了解密这只企鹅为什么可以坐在空气上。现在，进入正题。\nlinux，又叫 GNU/linux，是一种免费使用和自由传播的类UNIX操作系统，其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布，它主要受到 Minix 和 Unix 思想的启发，是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux 继承了 Unix 以网络为核心的设计思想，是一个性能稳定的多用户网络操作系统。Linux 有上百种不同的发行版，如基于社区开发的 debian、archlinux，和基于商业开发的 Red Hat Enterprise Linux、SUSE、oracle linux 等。\n系统简史 Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱：Unix 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和 Internet 网络。\n20世纪80年代，计算机硬件的性能不断提高，PC的市场不断扩大，当时可供计算机选用的操作系统主要有 Unix、DOS 和 MacOS 这几种。Unix 价格昂贵，不能运行于PC；DOS 显得简陋，且源代码被软件厂商严格保密；MacOS 是一种专门用于苹果计算机的操作系统。此时，计算机科学领域迫切需要着一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少，因此当时在荷兰当教授的美国人 Andrew S. Tanenbaum 编写了一个操作系统，名为 MINIX，为了向学生讲述操作系统内部工作原理。MINIX 虽然很好，但只是一个用于教学目的的简单操作系统，而不是一个强有力的实用操作系统，然而最大的好处就是公开源代码。全世界学计算机的学生都通过钻研 MINIX 源代码来了解电脑里运行的 MINIX 操作系统，芬兰赫尔辛基大学大学二年级的学生 Linus Torvalds 就是其中一个，在吸收了 MINIX 精华的基础上，Linus 于1991年写出了属于自己的 Linux 操作系统，版本为 Linux 0.01，是 Linux 时代开始的标志。他利用 Unix 的核心，去除繁杂的核心程序，改写成适用于一般计算机的 x86 系统，并放在网络上供大家下载，1994年推出完整的核心 Version 1.0，至此，Linux 逐渐成为功能完善、稳定的操作系统，并被广泛使用。\n服务器 Linux 服务器是设计出来进行业务处理应用的，在网络和计算机系统当中有广泛的应用，可以提供数据库管理和网络服务等内容，是一种性能非常高的和开源的服务器，在我国的计算机系统的客户端当中，有很多采用的就是 Linux 系统，其使用的范围非常广泛，用户体验反应较好。但是对于一些希望计算机应用性能比较高的单位而言，windows 系统需要经常进行资源整合和碎片化管理，系统在配置的时候经常需要重新启动，这就无法避免产生停机的问题。同时，由于 Linux 系统的处理能力非常强悍，具备不可比拟的稳定性特征，因而 Linux 系统就不用经常进行重启，Linux 系统的变化可以在配置的过程中实现，所以 Linux 服务器出现故障的概率比较小，所以很多企业组织在计算机配置的过程中经常使用 Linux 系统，从而降低服务器发生崩溃的可能性，很多企业在配置 Linux 系统的时候，都是通过减少服务器的故障发生率，实现企业业务的高效运转。\n系统内核的路由转发 Linux 操作系统嵌入了 TCP/IP 协议栈，协议软件具有路由转发功能。路由转发依赖作为路由器的主机中安装多块网卡，当某一块网卡接收到数据包后，系统内核会根据数据包的目的 IP 地址，查询路由表，然后根据查询结果将数据包发送到另外一块网卡，最后通过此网卡把数据包发送出去。此主机的处理过程就是路由器完成的核心功能。\n通过修改 Linux 系统内核参数 ip_forward 的方式实现路由功能，系统使用 sysctl 命令配置与显示在 /proc/sys 目录中的内核参数。首先在命令行输入：cat /proc/sys/net/ipv4/ip_forward，检查 Linux 内核是不是开启 IP 转发功能。如果结果为 1，表明路由转发功能已经开启；如果结果为 0，表明没有开启。出于安全考虑，Linux 内核默认是禁止数据包路由转发的。在 linux 系统中，有临时和永久两种方法启用转发功能。\n临时启用：此种方法只对当前会话起作用，系统重启后不再启用。临时开启的命令格式：sysctl -w net.ipv4.ip_forward=1。\n永久启用：此种永久性的启用 IP 转发功能，通过更改配置文件 /etc/sysctl.conf 中的语句行 net.ipv4.ip_forward=0，修改为 net.ipv4.ip_forward=1，保存配置文件后执行命令 sysctl -p /etc/sysctl.conf，配置便立即启用。\n安全隐患及加固措施 用户账户以及登录安全 删除多余用户和用户组。Linux 是多用户操作系统，存在很多种不一样的角色系统账号，当安装完成操作系统之后，系统会默认为未添加许用户组及用户，若是部分用户或是用户组不需要，应当立即删除它们，否则黑客很有可能利用这些账号，对服务器实施攻击。具体保留哪些账号，可以依据服务器的用途来决定。\n关闭不需要的系统服务。操作系统安装完成之后，其会在安装的过程当中，会自主的启动各种类型的服务程序内容，对于长时间运行的服务器而言，其运行的服务程序越多，则系统的安全性就越低。所以，用户或是用户组就需要将一些应用不到的服务程序进行关闭，这对提升系统的安全性能，有着极大的帮助。\n密码安全策略。在 Linux 之下，远程的登录系统具备两种认证的形式：即密钥与密码认证。其中，密钥认证的形式，主要是将公钥储存在远程的服务器之上，私钥存储在本地。当进行系统登陆的时候，再通过本地的私钥，以及远程的服务器公钥，进行配对认证的操作，若是认证的匹配度一致，则用户便能够畅通无阻的登录系统。此类认证的方式，并不会受到暴力破解的威胁。与此同时，只需要确保本地私钥的安全，使其不会被黑客所盗取即可，攻击者便不能够通过此类认证方式登陆到系统中。所以，推荐使用密钥方式进行系统登陆。\n有效应用 su、sudo 命令。su 命令的作用的是对用户进行切换。当管理员登录到系统之后，使用 su 命令切换到超级用户角色来执行一些需要超级权限的命令。但是由于超级用户的权限过大，同时，需要管理人员知道超级用户密码，因此 su 命令具有很严重的管理风险。sudo 命令允许系统赋予普通用户一些超级权限，并且不需普通用户切换到超级用户。因此，在管理上应当细化权限分配机制，使用 sudo 命令为每一位管理员服务其特定的管理权限。\n远程访问及登陆认证安全 远程登录应用 SSH 登陆方式。telnet 是一类存在安全隐患的登录认证服务，其在网络之上利用明文传输内容，黑客很容易通过截获 telnet 数据包，获得用户的登陆口令。并且 telnet 服务程序的安全验证方式存在较大的安全隐患，使其成为黑客攻击的目标。SSH 服务则会将数据进行加密传输，能够防止 DNS 欺骗以及 IP 欺骗，并且传输的数据是经过压缩，在一定程度上保证了服务器远程连接的安全。\n文件系统的安全 加固系统重要文件。在 Linux 系统中，如果黑客取得超级权限，那么他在操作系统里面就不会再有任何的限制地做任何事情。在这种情况下，一个加固的文件系统将会是保护系统安全的最后一道防线。管理员可通过 chattr 命令锁定系统一些重要文件或目录。\n文件权限检查与修改。如果操作系统当中的重要文件的权限设置不合理，则会对操作系统的安全性，产生最为直接的影响。所以，系统的运行维护人员需要及时的察觉到权限配置不合理的文件和目录，并及时修正，以防安全事件发生。\n安全设定 /tmp、/var/tmp、/dev/shm。在该操作系统当中，其用于存放临时文件的目录，主要有两个，分别为 /tmp 与 /var/tmp。它们有个共同特点，就是所有的用户可读可写和执行，这样就对系统产生了安全隐患。针对这两个目录进行设置，不允许这两个目录下执行应用程序。\n系统软件安全 绝大多数的服务器遭受攻击是因为系统软件或者应用程序有重大漏洞。黑客通过这些漏洞，可以轻松地侵入服务器。管理员应定期检查并修复漏洞。最常见的做法是升级软件，将软件保持在最新版本状态。这样就可以在一定程度上降低系统被入侵的可能性。\n开发工具 Linux 已经成为工作、娱乐和个人生活等多个领域的支柱，人们已经越来越离不开它。在 Linux 的帮助下，技术的变革速度超出了人们的想象，Linux 开发的速度也以指数规模增长。因此，越来越多的开发者也不断地加入开源和学习 Linux 开发地潮流当中。在这个过程之中，合适的工具是必不可少的，可喜的是，随着 Linux 的发展，大量适用于 Linux 的开发工具也不断成熟。\n容器 放眼现实，如今已经是容器的时代了。容器既极其容易部署，又可以方便地构建开发环境。如果针对的是特定的平台的开发，将开发流程所需要的各种工具都创建到容器映像中是一种很好的方法，只要使用这一个容器映像，就能够快速启动大量运行所需服务的实例。\n版本控制工具 如果正在开发一个大型项目，又或者参与团队开发，版本控制工具是必不可少的，它可以用于记录代码变更、提交代码以及合并代码。如果没有这样的工具，项目几乎无法妥善管理。\n文本编辑工具 如果没有文本编辑器，在 Linux 上开发将会变得异常艰难。当然，文本编辑器之间孰优孰劣，具体还是要取决于开发者的需求。\n集成开发环境 有时候会需要比较两个文件的内容来找到它们之间的不同之处，它们可能是同一文件的两个不同副本。这种情况下，肯定不想要凭借肉眼来找出差异，而是想要使用像 Meld 这样的工具。\nLinux有多少？ 这还不算多的，说实在一点，Mac只是Linux的一个亚种……\n那么，这么多的操作系统，我偏偏选了 deepin 来讲，是为什么？说实在一点因为这操作系统是一个超新星，它的外貌很是出众，看看官方的视频就知道了。\nDeepin deepin（原名：Linux Deepin；中文通称：深度操作系统）是由武汉深之度科技有限公司在 Debian 基础上开发的 Linux 操作系统，其前身是 Hiweed Linux 操作系统，于2004年2月28日开始对外发行，可以安装在个人计算机和服务器中。\ndeepin 操作系统内部集成了 deepin Desktop Environment（中文通称：深度桌面环境），并支持 deepin store、deepin Music、deepin Movie 等第一方应用软件。\n2019年，华为开始销售预装有 deepin 操作系统的笔记本电脑。\n2020年，深之度正式发布了 deepin v20 版本，底层仓库升级到 Debian 10.5，系统安装则采用了 Kernel 5.4 和 Kernel 5.7 双内核机制，同时用户操作界面也得到了大幅度的调整。\n介绍 深度操作系统是基于 Linux 内核，以桌面应用为主的开源 GNU/Linux 操作系统，支持笔记本、台式机和一体机。深度操作系统（deepin）包含深度桌面环境（DDE）和近30款深度原创应用，及数款来自开源社区的应用软件，支撑广大用户日常的学习和工作。另外，通过深度商店还能够获得近千款应用软件的支持，满足您对操作系统的扩展需求。\n深度操作系统（deepin）是中国第一个具备国际影响力的 Linux 发行版本，截止至2019年7月25日，深度操作系统支持33种语言，用户遍布除了南极洲的其它六大洲。深度桌面环境（deepin DDE）和大量的应用软件被移植到了包括 Fedora、Ubuntu、Arch 等十余个国际 Linux 发行版和社区，在开源操作系统统计网站 DistroWatch 上，deepin 长期位于世界前十。\n深度桌面环境 应用程序一览无余：可通过点击屏幕左下角的“应用程序启动器（Launcher）”按钮，或 Alt+F2 组合键打开。 新底部 Dock：快速打开常用程序，支持应用程序快捷方式的添加与删除。 简洁的消息通知：通知显示区域为屏幕右下角。 深度系统设置：采用 Deepin UI 图形库，支持自动调节屏幕亮度、农历日期显示、快速设置用户头像等。 深度原生应用 深度文件管理器、深度系统监视器、深度字体安装器、深度备份还原工具、深度取色器、深度商店、深度录屏、深度录音、深度截图、深度终端、深度看图、深度影院、深度音乐、深度云打印、深度云扫描、深度日历、深度远程协助、深度启动盘制作工具、深度安装器……\n如何安装deepin? 文章到此结束，谢谢你看到了这里……送个大风车给你吧！不要谢我。\n我是 ","permalink":"https://xixi-cmd.github.io/posts/linux2_deepin/","summary":"\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=31721420\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\n\u003ch2 id=\"linux\"\u003eLinux\u003c/h2\u003e\n\u003cp\u003e说起Linux，你一定会联想到一只傻傻的企鹅坐在空气上。\u003c/p\u003e\n\u003cp\u003e就在快要过去的2020年，linux29岁了。对29了。很明显，我这次文章的目的不是为了解密这只企鹅为什么可以坐在空气上。现在，进入正题。\u003c/p\u003e\n\u003cp\u003elinux，又叫 GNU/linux，是一种免费使用和自由传播的类UNIX操作系统，其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布，它主要受到 \u003ccode\u003eMinix\u003c/code\u003e 和 \u003ccode\u003eUnix\u003c/code\u003e 思想的启发，是一个基于 \u003ccode\u003ePOSIX\u003c/code\u003e 和 \u003ccode\u003eUnix\u003c/code\u003e 的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的 \u003ccode\u003eUnix\u003c/code\u003e 工具软件、应用程序和网络协议。它支持32位和64位硬件。\u003ccode\u003eLinux\u003c/code\u003e 继承了 \u003ccode\u003eUnix\u003c/code\u003e 以网络为核心的设计思想，是一个性能稳定的多用户网络操作系统。\u003ccode\u003eLinux\u003c/code\u003e 有上百种不同的发行版，如基于社区开发的 \u003ccode\u003edebian\u003c/code\u003e、\u003ccode\u003earchlinux\u003c/code\u003e，和基于商业开发的 \u003ccode\u003eRed Hat Enterprise Linux\u003c/code\u003e、\u003ccode\u003eSUSE\u003c/code\u003e、\u003ccode\u003eoracle linux\u003c/code\u003e 等。\u003c/p\u003e\n\u003ch3 id=\"系统简史\"\u003e系统简史\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eLinux\u003c/code\u003e 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱：\u003ccode\u003eUnix\u003c/code\u003e 操作系统、\u003ccode\u003eMINIX\u003c/code\u003e 操作系统、\u003ccode\u003eGNU\u003c/code\u003e 计划、\u003ccode\u003ePOSIX\u003c/code\u003e 标准和 \u003ccode\u003eInternet\u003c/code\u003e 网络。\u003c/p\u003e\n\u003cp\u003e20世纪80年代，计算机硬件的性能不断提高，PC的市场不断扩大，当时可供计算机选用的操作系统主要有 \u003ccode\u003eUnix\u003c/code\u003e、\u003ccode\u003eDOS\u003c/code\u003e 和 \u003ccode\u003eMacOS\u003c/code\u003e 这几种。\u003ccode\u003eUnix\u003c/code\u003e 价格昂贵，不能运行于PC；\u003ccode\u003eDOS\u003c/code\u003e 显得简陋，且源代码被软件厂商严格保密；\u003ccode\u003eMacOS\u003c/code\u003e 是一种专门用于苹果计算机的操作系统。此时，计算机科学领域迫切需要着一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少，因此当时在荷兰当教授的美国人 \u003ccode\u003eAndrew S. Tanenbaum\u003c/code\u003e 编写了一个操作系统，名为 \u003ccode\u003eMINIX\u003c/code\u003e，为了向学生讲述操作系统内部工作原理。\u003ccode\u003eMINIX\u003c/code\u003e 虽然很好，但只是一个用于教学目的的简单操作系统，而不是一个强有力的实用操作系统，然而最大的好处就是公开源代码。全世界学计算机的学生都通过钻研 \u003ccode\u003eMINIX\u003c/code\u003e 源代码来了解电脑里运行的 \u003ccode\u003eMINIX\u003c/code\u003e 操作系统，芬兰赫尔辛基大学大学二年级的学生 \u003ccode\u003eLinus Torvalds\u003c/code\u003e 就是其中一个，在吸收了 \u003ccode\u003eMINIX\u003c/code\u003e 精华的基础上，\u003ccode\u003eLinus\u003c/code\u003e 于1991年写出了属于自己的 \u003ccode\u003eLinux\u003c/code\u003e 操作系统，版本为 \u003ccode\u003eLinux 0.01\u003c/code\u003e，是 \u003ccode\u003eLinux\u003c/code\u003e 时代开始的标志。他利用 \u003ccode\u003eUnix\u003c/code\u003e 的核心，去除繁杂的核心程序，改写成适用于一般计算机的 \u003ccode\u003ex86\u003c/code\u003e 系统，并放在网络上供大家下载，1994年推出完整的核心 \u003ccode\u003eVersion 1.0\u003c/code\u003e，至此，\u003ccode\u003eLinux\u003c/code\u003e 逐渐成为功能完善、稳定的操作系统，并被广泛使用。\u003c/p\u003e","title":"国产linux操作系统deepin"},{"content":"欢迎交换友链！如果你也是技术/编程领域的博主，欢迎联系我交换友链 🤝\n","permalink":"https://xixi-cmd.github.io/links/","summary":"\u003cp\u003e欢迎交换友链！如果你也是技术/编程领域的博主，欢迎联系我交换友链 🤝\u003c/p\u003e\n\u003chr\u003e","title":"友情链接"}]