C++学习笔记(一)

发布时间:2026/10/21 0:55:08

C++学习笔记(一) 6. C 的第一个程序C 兼容 C 语言绝大多数语法因此 C 语言风格的hello world程序在 C 中仍可运行但 C 也有专属的输入输出实现核心差异体现在头文件与输入输出对象的使用上。6.1 两种实现方式对比实现风格代码示例关键说明C 语言兼容版cpp#includestdio.hint main(){printf(hello world\n);return 0;}1. 依赖 C 语言标准输入输出头文件stdio.h2. 编译要求文件后缀需改为.cppVS 编译器会调用 C 编译器Linux 环境需用g编译而非 C 语言的gcc3. 本质是复用 C 语言的printf函数实现输出。C 专属版cpp#includeiostreamusing namespace std;int main(){cout hello world\n endl;return 0;}1. 依赖 C 标准输入输出流库头文件iostream2.std是 C 标准库命名空间using namespace std用于简化代码避免每次使用标准库组件都添加std::前缀3.cout是 C 标准输出对象为流插入运算符endl的作用是插入换行符并刷新缓冲区。7. 命名空间命名空间namespace是 C 为解决 “命名冲突” 问题设计的核心机制通过将变量、函数、类等标识符封装在独立的作用域中避免全局作用域内的名字污染。7.1 命名空间的价值在 C 语言中全局作用域下的变量、函数极易发生命名冲突例如自定义的rand变量与标准库中的rand函数冲突。C 引入命名空间后通过 “域隔离” 解决此问题不同命名空间内可定义同名标识符编译时编译器会按 “作用域” 查找标识符的声明或定义有效避免冲突C 标准库如cout、vector等全部封装在stdstandard命名空间中。7.2 命名空间的定义规则基本定义使用namespace关键字 命名空间名 花括号{}花括号内可定义变量、函数、结构体等成员本质是创建一个独立的作用域。cpp运行// 以项目名“bit”作为命名空间名实际开发中可使用项目名或个人缩写 namespace bit { int rand 10; // 与标准库rand函数不冲突 int Add(int left, int right) { return left right; } // 命名空间内可定义结构体 struct Node { int val; struct Node* next; }; }嵌套定义命名空间支持嵌套可用于解决多层级的命名冲突问题。cpp运行namespace bit { // 子命名空间pg namespace pg { int rand 1; int Add(int left, int right) { return left right; } } // 子命名空间hg namespace hg { int rand 2; int Add(int left, int right) { return (left right) * 10; } } }多文件合并特性不同文件中定义的同名命名空间编译器会自动将其合并为一个。例如在Stack.h和Queue.h中分别定义的namespace bit最终会被视为同一个命名空间。作用域特性命名空间仅影响编译器对标识符的 “查找逻辑”不影响变量的生命周期C 中的作用域类型包括函数局部域、全局域、命名空间域、类域。7.3 命名空间的使用方式编译器默认仅在局部域和全局域中查找标识符若需使用命名空间内的成员需通过以下方式访问推荐度从高到低依次为指定命名空间访问项目开发推荐通过命名空间名::成员名的格式精准访问无命名冲突风险。cpp运行int main() { // 访问bit命名空间中的rand变量 printf(%d\n, bit::rand); // 访问bit::pg子命名空间中的Add函数 printf(%d\n, bit::pg::Add(1, 2)); return 0; }using展开单个成员使用using 命名空间名::成员名将命名空间中的单个成员纳入当前作用域适合高频使用且无冲突的成员。cpp运行// 展开bit::hg命名空间中的rand成员 using bit::hg::rand; int main() { // 直接使用展开的rand成员 printf(%d\n, rand); // 其他成员仍需指定命名空间 printf(%d\n, bit::pg::rand); return 0; }using展开全部成员仅推荐小练习使用使用using namespace 命名空间名将命名空间中的所有成员纳入当前作用域项目开发中易引发命名冲突不推荐使用。cpp运行// 展开bit命名空间的所有成员 using namespace bit; int main() { // 直接使用bit命名空间中的rand成员 printf(%d\n, rand); // 子命名空间成员仍需指定子命名空间 printf(%d\n, pg::Add(1, 2)); return 0; }8. C 输入 输出C 通过iostream库提供输入输出功能简称 IO 流核心优势是 “自动识别变量类型” 和 “支持自定义类型的输入输出”无需像 C 语言那样手动指定格式符。8.1 核心组件与功能组件功能说明用法示例std::cin标准输入对象对应键盘输入为流提取运算符用于读取数据int a; double b; cin a b;自动识别a和b的类型并读取std::cout标准输出对象对应屏幕输出为流插入运算符用于输出数据cout a b endl;std::endl特殊操作符作用是插入换行符并刷新输出缓冲区区别于\n仅插入换行符cout hello C endl;iostreamC 标准输入输出流库头文件必须包含才能使用cin、cout、endl代码开头需添加#include iostream8.2 关键特性与注意事项自动类型识别编译器通过函数重载实现变量类型的自动匹配无需像printf/scanf那样指定格式符如%d、%lf。cpp运行int a 0; double b 0.1; char c x; // 自动识别类型并输出 cout a b c endl; // 自动识别类型并读取 cin a b c;效率优化在大量输入的场景如算法竞赛中可通过以下代码关闭 C 与 C IO 流的同步提升输入输出效率cpp运行#includeiostream using namespace std; int main() { ios_base::sync_with_stdio(false); // 关闭C和C IO同步 cin.tie(nullptr); // 解除cin与cout的绑定 cout.tie(nullptr); // 后续输入输出操作效率提升 return 0; }命名空间依赖cin、cout、endl均属于 C 标准库封装在std命名空间中使用时需通过std::前缀或using namespace std展开。9. 缺省参数缺省参数又称默认参数是指在声明或定义函数时为函数的形参指定一个默认值。调用函数时若未传递实参则使用形参的默认值若传递了实参则使用指定的实参。9.1 缺省参数的分类与规则分类代码示例核心规则全缺省参数cppvoid Func1(int a 10, int b 20, int c 30){cout a a , b b , c c endl;}所有形参均指定默认值调用时可传递 0~n 个实参如Func1()、Func1(1)、Func1(1,2)、Func1(1,2,3)均合法。半缺省参数cppvoid Func2(int a, int b 10, int c 20){cout a a , b b , c c endl;}仅部分形参指定默认值必须从右往左连续缺省不可间隔缺省如void Func(int a10, int b)为非法写法调用时需从左到右传递实参如Func2(100)、Func2(100,200)、Func2(100,200,300)均合法。9.2 注意事项声明与定义分离时缺省值仅能在声明中指定若函数声明和定义分离如头文件.h中声明源文件.cpp中定义缺省参数只能在声明中设置定义中不可重复设置避免编译器产生歧义。cpp运行// Stack.h函数声明指定缺省值 typedef int STDataType; typedef struct Stack { STDataType* a; int top; int capacity; }ST; void STInit(ST* ps, int n 4); // Stack.cpp函数定义不指定缺省值 #include Stack.h void STInit(ST* ps, int n) { assert(ps n 0); ps-a (STDataType*)malloc(n * sizeof(STDataType)); ps-top 0; ps-capacity n; }实用场景初始化容器时可根据需求指定初始大小。例如栈初始化时默认开辟 4 个空间若已知需存储 1000 个数据可直接传递 1000 作为实参避免后续扩容操作。10. 函数重载函数重载是 C 的重要特性允许在同一作用域中定义同名函数但要求这些同名函数的形参满足 “不同”形参个数不同、形参类型不同或形参顺序不同从而实现灵活的函数调用。C 语言不支持函数重载。10.1 函数重载的判定条件重载类型代码示例说明形参类型不同cpp//int 类型参数的 Add 函数int Add(int left, int right){cout int Add(int, int) endl;return left right;}//double 类型参数的 Add 函数double Add(double left, double right){cout double Add(double, double) endl;return left right;}调用时编译器根据实参类型匹配对应的函数如Add(1,2)调用int类型版本Add(1.1,2.2)调用double类型版本。形参个数不同cpp// 无参版本的 f 函数void f(){cout f() endl;}// 一个 int 参数版本的 f 函数void f(int a){cout f(int) endl;}调用时编译器根据实参个数匹配对应的函数如f()调用无参版本f(10)调用int参数版本。形参顺序不同cpp// 先 int 后 char 的 f 函数void f(int a, char b){cout f(int, char) endl;}// 先 char 后 int 的 f 函数void f(char b, int a){cout f(char, int) endl;}调用时编译器根据实参顺序匹配对应的函数如f(10, a)调用第一个函数f(a, 10)调用第二个函数。10.2 不构成重载的情况返回值不同不能作为重载条件函数调用时编译器无法根据返回值类型区分同名函数如int f()和void f()调用f()会报错。缺省参数可能导致歧义若同名函数的参数个数相同且包含缺省参数调用时可能出现匹配歧义。例如void f1()和void f1(int a10)调用f1()时编译器无法确定使用哪个函数会报歧义错误。11. 引用引用是 C 中的重要概念本质是给已存在的变量取一个 “别名”引用与原变量共用同一块内存空间编译器不会为引用开辟额外的内存。引用的核心用途是优化函数传参和返回值减少数据拷贝。11.1 引用的概念与定义语法格式类型 引用名 原变量此处为引用符号非取地址符号需与指针的区分代码示例cpp运行#includeiostream using namespace std; int main() { int a 0; int b a; // b是a的别名 int c a; // c也是a的别名 int d b; // d是b的别名本质仍是a的别名 d; // 修改d等同于修改aa的值变为1 // 引用与原变量地址相同 cout a endl; cout b endl; cout c endl; cout d endl; return 0; }11.2 引用的三大特性定义时必须初始化引用是变量的别名必须在定义时明确绑定一个已存在的变量未初始化的引用会导致编译报错如int ra;为非法写法。一个变量可以有多个引用如同一个人可以有多个名字一个变量也可以有多个别名如上述代码中a的别名b、c、d。引用一旦绑定实体不可更改指向引用绑定某个变量后始终指向该变量无法重新指向其他变量。例如b c的操作是将c的值赋给b即赋给a而非让b重新指向c。11.3 引用的实际用途引用的核心价值在于 “减少数据拷贝” 和 “直接操作原变量”主要应用于函数传参和函数返回值场景。11.3.1 引用传参引用传参可替代指针传参简化代码逻辑同时避免指针的复杂性如二级指针且能直接修改原变量的值功能与指针传参一致。代码示例实现交换函数cpp运行#includeiostream using namespace std; // rx是x的别名ry是y的别名 void Swap(int rx, int ry) { int tmp rx; rx ry; ry tmp; } int main() { int x 0, y 1; cout 交换前x x , y y endl; Swap(x, y); // 直接传递变量无需传递地址 cout 交换后x x , y y endl; return 0; }实用场景在数据结构操作中如链表插入、栈初始化使用引用传参可避免二级指针。例如链表头插时使用ListNode* phead指针的引用直接修改头指针无需传递二级指针。11.3.2 引用返回值当函数返回的是 “函数结束后不会销毁的变量”如全局变量、类成员变量、动态内存分配的变量时使用引用返回可避免返回值的拷贝操作提升程序效率。若返回局部变量引用会成为 “野引用”局部变量销毁后引用指向的内存空间失效导致程序错误。代码示例获取栈顶元素栈顶元素存储在栈结构中函数结束后不销毁cpp运行#includeiostream #includeassert.h using namespace std; typedef int STDataType; typedef struct Stack { STDataType* a; int top; int capacity; }ST; void STInit(ST rs, int n 4) { rs.a (STDataType*)malloc(n * sizeof(STDataType)); rs.top 0; rs.capacity n; } void STPush(ST rs, STDataType x) { assert(rs.top rs.capacity); // 扩容逻辑此处省略 rs.a[rs.top] x; rs.top; } // 引用返回栈顶元素 int STTop(ST rs) { assert(rs.top 0); // 确保栈非空 return rs.a[rs.top - 1]; // 返回栈顶元素的引用 } int main() { ST st; STInit(st); STPush(st, 2); STTop(st) 10; // 直接修改栈顶元素2变为12 cout 栈顶元素 STTop(st) endl; // 输出12 return 0; }
延伸阅读

更多相关文章

2026/10/21 3:43:03

【51单片机】 1.1 初识单片机(初学必看)

目录 一、基本结构与最小电路 二、软件基础&#xff08;结合硬件&#xff09; 三、基础元器件 四、晶振和复位 一、基本结构与最小电路 二、软件基础&#xff08;结合硬件&#xff09; 1.头文件#include<reg52.h> 解释&#xff1a;2.LED小灯点亮&#xff1a;P0^0、P0^1对…

2026/10/18 10:16:16

LPS28DFW实战:双重满量程与防水封装实现海拔水深同步监测

去年做一款户外运动记录设备&#xff0c;需要同时完成海拔高度和水深记录两个功能。前期选型的时候翻了不少气压计&#xff0c;遇到的尴尬很统一——量程够用的不防水&#xff0c;防水的量程又太窄&#xff0c;好一点的要上双芯片方案&#xff0c;但体积和功耗都扛不住。后来翻…

2026/10/21 6:36:32

订单表慢SQL优化实战:联合索引、覆盖索引与深分页方案

1. 场景回顾&#xff1a;慢SQL是怎么暴露出来的做订单系统的同学应该都有体会&#xff1a;订单表往往是整个业务库里面数据量增长最快、查询模式最多样、索引也最容易“被用坏”的一张表。这个实战项目来自某电商平台的中台订单模块&#xff0c;核心表trade_order存放全渠道的订…

2026/10/21 6:36:32

Spring Boot+Android旧物交易平台毕设全攻略:从数据库到答辩

1. 毕设避坑指南&#xff1a;为什么旧物交易平台是毕业设计的“安全牌”每年到了三四月份&#xff0c;总有一批计算机专业的大四学生开始焦虑——选题没定、开题报告没写、代码一行没敲。如果你也是这个状态&#xff0c;又恰好刷到了“基于springbootAndroid的旧物交易平台”这…

2026/10/21 6:36:32

Chrome/Edge DevTools调试实战:从快捷键到断点的前端排查全攻略

Chrome和Edge的调试工具&#xff0c;大概是前端工程师每天相处时间最长的东西。我早年只会按F12看一眼Console里的报错&#xff0c;遇到红字就截图发群里问&#xff0c;后来熟练到能在Network里抓包、在Sources里打断点、在Performance里录帧率&#xff0c;才发现DevTools这套东…

2026/10/21 6:36:32

500Hz方波三角波发生器:LM324+555电路设计、Multisim仿真与参数反推

简介&#xff1a;这是一份面向数电与模电课程设计的实用PDF文档&#xff0c;围绕“方波-三角波发生器频率计”的完整实现展开&#xff0c;适合电子类本科生及参加课程设计的读者学习参考。文档以LM324电压比较器为核心&#xff0c;先通过滞回比较器产生500Hz方波&#xff0c;再…

2026/10/21 6:31:29

从自我效能感到自我价值感:AGI自主智能体的内部评价机制

刚看到这个标题的时候&#xff0c;我第一反应是&#xff1a;AGI基础理论串讲里怎么冒出来两个心理学名词&#xff1f;后来自己动手做某自主智能体项目&#xff0c;被“该不该继续尝试”和“这件事值不值得坚持”这类问题反复卡住&#xff0c;再回头翻这一节&#xff0c;才明白它…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介&#xff1a;这份PDF报告聚焦2025年金融服务业中国AI现状与趋势&#xff0c;面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者&#xff0c;帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件&#xff0c;大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介&#xff1a;这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目&#xff0c;核心实现智能驾驶模型&#xff08;IDM&#xff09;下的车辆跟驰与换道行为&#xff0c;可用于理解速度、密度与流量之间的动态关系&#xff0c;适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”&#xff0c;而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时&#xff0c;我反复遇到一种令人困惑的现象&#xff1a;智能体在用户指令发出后&#xff0c;几乎秒级响应“已收到”“正在处理”“请稍候”&#xff0c;UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑