封装
代码仓库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()方法,获取遍历的起始和结束位置,然后依次取出每个元素赋值给循环变量,直到遍历结束。 简单说:无需手动控制索引或迭代器,自动遍历所有元素。 常用场景与示...
类型推导
代码仓库shanchuann/CPP-Learninng 在 C++11 标准之前,开发者不得不面对冗长且易出错的类型声明 —— 无论是std::vector<std::map<std::string, int>>::iterator这样的复杂容器迭代器,还是依赖模板参数的动态类型,都需要手动精确指定。这种方式不仅降低了开发效率,更增加了代码维护的成本。为解决这一痛点,C++11 引入了auto和decltype两个关键字,将类型推导的工作交给编译器,实现了代码的简化与灵活性的提升。 auto 是 C++11 起引入的占位符类型说明符,核心作用是让编译器从初始化器或表达式中推导类型,简化代码编写;C++14 起新增decltype(auto)变体,进一步扩展了类型推导的精确性。其语法、用法及约束均围绕 “从上下文推导类型” 展开,适用于变量、函数、参数等多种场景。 autoauto 的语法分为两种形式,支持 C++20 起的 “类型约束”(基于概念)来限制推导范围: 基础形式:可选类型约束 + auto 1const auto x = 5; ...
new和delete
代码仓库shanchuann/CPP-Learninng 可执行程序(进程)的虚拟地址空间: 在C++中,new和delete是用于动态内存管理的核心运算符,它们不仅负责内存的分配与释放,还会自动调用对象的构造函数和析构函数,是面向对象编程中管理动态对象的关键工具。 在C语言中,从堆区申请空间的库函数有malloc realloc calloc 三个,无论用谁申请,最终要使用free释放 在C++中,使用new申请,使用delete释放 new的基本用法new的作用是动态分配内存并构造对象,根据分配的对象类型可分为以下几种形式: 单个对象的动态分配语法:类型* 指针 = new 类型(初始化值); 分配一块能容纳该类型对象的内存; 自动调用该类型的构造函数(如果是类对象); 返回指向该对象的指针(类型匹配,无需强制转换)。 1int* New = new int(12); //1. sizeof(int) 2. malloc(sizeof(int)) 3. put 12 in that memory 4. return address of th...
函数模板
代码仓库shanchuann/CPP-Learninng 函数模板被称为”生成代码的代码”,是 C++ 通用编程的核心工具,它通过参数化类型定义一族函数的蓝图,编译时会根据实际使用的类型 / 值自动生成具体函数实例,无需为每种场景重复编写相同逻辑,大幅提升代码复用性与扩展性。 函数模板的声明 / 定义需遵循特定语法,C++ 标准演进中新增了简化语法,同时废弃了部分特性,核心语法分为以下几类: 函数模板的语法标准语法(C++98 起)基础语法通过template关键字声明模板参数列表,后接函数声明 / 定义,适用于所有 C++ 标准。 123456789101112// 语法格式:template <参数列表> 函数声明/定义template <typename T> // T为类型模板参数,typename可替换为classT max(T a, T b) { return a > b ? a : b;}template <int N, typename T> // ...
命名空间namespace
代码仓库shanchuann/CPP-Learninng 在C++中支持三种域:局部域,命名空间域,类域 在 C++ 大型项目开发中,不同模块、库或开发者定义的同名变量、函数、类很容易引发 “名称冲突”。命名空间(namespace)作为 C++ 的核心特性之一,通过划分 “名称作用域”,为解决全局变量的命名污染问题,全局标识符的污染问题提供解决方案。 12345678910111213141516int Global_scope = 10; //全局作用域void Local_scope() { int Local_scope = 20; //局部作用域 { int Block_scope = 30; //块作用域 cout << "Block_scope: " << Block_scope << endl; cout << "Local_scope: " << Local_scope << endl; cout <&l...
名字粉碎
代码仓库shanchuann/CPP-Learninng 名字粉碎(Name Mangling,也称为名字修饰) 是编译器为解决命名冲突(如函数重载、类成员、命名空间、模板等场景)而对标识符(函数名、变量名等)进行的特殊编码处理。其核心目的是生成唯一的符号名,确保链接阶段能准确识别不同的实体。 C 语言不支持函数重载、类、命名空间等特性,函数名本身即可唯一标识一个函数,因此无需修饰。但 C++ 支持以下特性,会导致同名实体存在,必须通过名字粉碎区分: 函数重载:允许同名函数存在,只要参数列表不同(参数类型、数量、顺序); 类成员函数:不同类中可以有同名成员函数; 命名空间:不同命名空间中可以有同名实体; 模板:模板实例化会生成不同的具体函数 / 类,需区分模板参数。 修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。 调用约定__stdcall(回调调用约定)是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈 12345678910111213void __stdcall funa(...





