Linux目录结构介绍
Linux系统的使用前置工作我在这里就不做赘述,大家尽可以选择喜欢的或是方便的方法来学习,我这里使用的是虚拟机+Ubuntu22.04和WSL Ubuntu24.04,大部分操作会在Linux子系统完成,涉及到图片等内容还是会去Ubuntu下截屏 目录结构介绍Linux 目录结构 Linux 目录结构是单根倒树状结构,所有目录都从根目录(/)衍生,遵循以下核心规则: 根目录唯一:所有文件 / 目录的起点都是 /,无 Windows 的 C 盘、D 盘概念。 FHS 标准:目录功能由 FHS 统一规定,确保不同 Linux 发行版(如 Ubuntu、CentOS)目录结构一致。 文件类型无关路径:无论文件是普通文件、设备文件还是虚拟文件,都通过目录路径访问。 常用目录详解 目录路径 核心作用 补充细节 / 根目录 所有目录的顶层,仅存放一级子目录(如/bin、/etc),不直接存文件 /bin 普通用户常用命令 存放ls、cd、cp等所有用户可执行的基础命令,命令多为二进制文件 /sbin 管理员专用命令 补充基础目录遗漏项,存放ifconfig...
拷贝构造函数
代码仓库shanchuann/CPP-Learninng 在C++面向对象编程中,拷贝构造函数是一种特殊的构造函数,用于用已存在的对象创建新对象。它是对象生命周期管理的核心机制之一,理解拷贝构造函数的原理和使用场景,对编写安全、高效的C++代码至关重要。 123456789101112131415class Int {private: int value;public: Int() :value(0) { std::cout << "Default create Int" << "at" << this << std::endl; } Int(int v) :value(v) { std::cout << "Create Int with value " << value << " at " << this << std::endl; ...
operator
代码仓库shanchuann/CPP-Learninng 在C++中,operator关键字用于定义和重载运算符,使得自定义类的对象可以使用标准运算符进行操作,从而提高代码的可读性和可维护性。 运算符重载的基本概念 作用:operator主要有两个作用,一是操作符的重载,二是操作符的转换。操作符重载是对C++进行扩展,让自定义类的对象能够像内置类型一样使用运算符。 可重载与不可重载的操作符:可重载的操作符包括+、-、*、/、%、^、&、|、~、!、=、<、>等;不可重载的操作符有.、.*、::、?:等。 运算符重载的语法运算符重载通过定义一个特殊的成员函数或友元函数来实现,其基本语法为:返回类型 operator 运算符 (参数列表)。例如,重载+运算符: 123456789class Complex {public: double real, imag; Complex(double r, double i) : real(r), imag(i) {} // 重载 + 运算符 Comple...
构造和析构
代码仓库shanchuann/CPP-Learninng 在C++中,构造函数和析构函数是类的特殊成员函数,分别用于对象的初始化和资源清理,它们由编译器自动调用,是面向对象编程中管理对象生命周期的核心机制。 this指针编译器对类型编译的过程中分为三个部分 **类型解析:**编译器首先对代码中的类型声明进行解析,识别类型的定义、成员结构(如类的成员变量和成员函数)、继承关系等信息。 函数识别:在语义分析阶段,编译器基于类型解析的结果,对程序中的函数返回类型、函数名、参数类型进行识别。 **成员方法改写:**无论成员方法是公有私有,他会对非静态成员方法加入常性this指针。 12345678910111213141516171819202122232425262728293031class Pointer {private: int row, col;public: void SetRow(int r) { row = r; } /* void SetRow(Pointer *const this...
关于spec-kit的使用经历
前几天我编写的《C语言圣经》成功配置并发布到互联网上,苦于没有合适的练习系统,又因为之前参加了一个训练营,其中的rustlings让我格外喜欢,因此也想做一个控制台交互程序来进行C语言的练习。 很可惜本人对相关脚本的知识八窍通了七窍,只好寄希望于AI来实现。这个系统的第一个版本是由cursor来为我设计并成功运行的,他由于是我第一次进行AI设计我毫无涉及领域的内容,因此只能浮于表象对大模型只通过自然语言对其进行鞭笞。不过好在最后成功上线Github上并给其命名为CStudy。 显而易见的,我对他的功能并不满意,因此我删掉了存储库后这个项目便一直搁置,知道前段时间我将Gitbook上传才重新开始编写。 这次我用的是字节跳动的Trea,参加过Cursor Meetup Xi’an后我尝试使用设计文档下的微调开发模式,先行给他一个设计文档,再根据模型的反馈进行逐步微调。但是Trea_CN的内置模型用到最后又变成了我面向结果的开发过程,导致整个项目混乱到像是恋爱关系,只好又清空文档,将目光投向前几天刷到的spec-kit上。 规范驱动开发颠覆了传统软件开发的脚本。几十年来,代码一直是王...
封装
代码仓库shanchuann/CPP-Learninng 封装的核心概念封装是面向对象编程(OOP)的三大特性之一(另外两个是继承和多态),其核心思想是将数据(属性)和操作数据的方法(行为)绑定为一个独立的单元(类),并通过访问控制隐藏内部实现细节,仅对外提供可控的接口。这种设计模式确保了数据的安全性、代码的可维护性和可扩展性。 封装的两层含义: 数据与行为的结合将描述对象状态的成员变量(如圆的半径)和操作这些变量的成员函数(如计算面积)组合在同一个类中,形成逻辑上的整体。例如: 1234567class Circle {private: double radius; // 数据成员public: void setRadius(double r) { radius = r; } // 行为成员 double getArea() { return 3.14 * radius * radius; }}; 访问控制与信息隐藏通过访问修饰符(public、protected、private)控...
string
代码仓库shanchuann/CPP-Learninng 12#include<string>#include<string.h> #include<string.h>:是C 语言标准库的头文件(C 标准),主要用于处理C 风格字符串(即以空字符'\0'结尾的字符数组,如char str[] = "hello")。它是 C 语言中字符串操作的基础头文件,C++ 为了兼容 C 语言,也支持包含该头文件。 #include<string>:是C++ 标准库的头文件(C++ 标准),专门用于支持 C++ 中的 **std::string类 **(一种封装了字符串功能的 C++ 类)。它是 C++ 面向对象思想下对字符串的封装,提供了更安全、便捷的字符串操作方式。 123456int main() { string s1 = "Hello"; string s2 = "World"; string s3 = s1 + " &q...
typedef与using
代码仓库shanchuann/CPP-Learninng 在 C/C++ 中,typedef 是用于为现有数据类型创建别名的关键字,可以把一切合法的变量名的定义转变为类型,它的核心作用是简化复杂类型的使用,提升代码的可读性和可维护性。 typedef 与 C++11 引入的 using 关键字相比,核心功能均为创建类型别名,但 using 在灵活性和语法直观性上更具优势。 什么是类型别名?typedef(C/C++ 通用)和 using(C++11 起)均用于为现有数据类型定义别名,而非创建新类型。它们的核心价值在于: 简化复杂类型(如函数指针、模板类型)的声明; 提升代码可读性(用语义化别名替代晦涩类型); 增强可维护性(跨平台或底层类型变更时,只需修改别名定义)。 基础语法与核心特性typedef 是 C 语言继承而来的关键字,在 C++ 中仍被广泛使用,尤其适用于简单场景和旧代码维护。基本语法为:typedef 原类型名 新类型名; 123456typedef unsigned int UINT;using UINT = unsign...
指针空值nullptr
代码仓库shanchuann/CPP-Learninng 在 C++ 中,nullptr是 C++11 标准引入的关键字,专门用于表示空指针,其设计目的是解决传统NULL在表示空指针时的歧义问题。 C++11 之前,通常用NULL表示空指针,但NULL本质是一个宏(定义为0或(void*)0),这会导致一些歧义: 若NULL被定义为0(多数编译器如此),当函数重载时,NULL会被当作整数0处理,而非指针类型,可能匹配错误的重载函数。 123456789101112131415161718192021void Nullptrfunc(int a){ cout << "int a = " << a << endl;}void Nullptrfunc(char* p){ if (p == nullptr) { cout << "char* p = nullptr" << endl; } else { cout ...
范围for循环
代码仓库shanchuann/CPP-Learninng 在C++中,范围for循环(range-based for loop) 是C++11引入的特性,专门用于便捷地遍历容器(如vector、list)、原生数组或其他可迭代对象中的所有元素,大幅简化了遍历代码的写法。 基本语法范围for循环的核心是“遍历整个范围的元素”,语法格式如下: 123for (元素类型 变量名 : 可迭代对象) { // 循环体(使用变量名访问当前元素)} 元素类型:当前遍历元素的类型(可使用auto自动推导,更简洁)。 变量名:用于接收当前遍历到的元素(相当于“临时变量”)。 可迭代对象:需要遍历的容器(如vector)、数组、字符串(string)等(本质是支持begin()和end()迭代器的对象)。 工作原理范围for循环本质上是通过迭代器实现的:编译器会自动调用可迭代对象的begin()和end()方法,获取遍历的起始和结束位置,然后依次取出每个元素赋值给循环变量,直到遍历结束。 简单说:无需手动控制索引或迭代器,自动遍历所有元素。 常用场景与示...






