C 到 C++ 丝滑过渡教程(入门基础篇)
目录 -一、namespace)1.1 namespace的价值1.2 namespace的定义1.3 命名空间的使用二、C输入输出三、缺省参数四、函数重载五、引用5.1 引用的特性5.2 引用的使用5.3 指针与引用的关系六、const引用七、inline八、nullptr一、namespace### 1.1 namespace 的价值值#includestdio.h#includestdlib.hintrand10;intmain(){// 编译报错“rand”: 重定义因为在头文件stdlib.h中rand是“函数名”printf(%d\n,rand);return0;}在一个项目中命名冲突是很常见的问题而 namespace 可以很好地解决决1.2 namespace的定义定义命名空间需要用到关键字 namespace结构为 namespace 空间名字 { }{ } 中为命名空间的成员可以定义函数、变量等。。 - namespace 本质是定义一个域这个域跟全局域各自独立即不同的域可以定义同名变量。namespace 只能定义在全局域但可以嵌套定义。#includestdio.h#includestdlib.hnamespaceTian{intrand10;//命名空间可以嵌套namespaceLi{intrand20;};namespaceNuo{intrand30;};}intmain(){// 打印标准库rand函数的地址函数要加printf(%p\n,rand);//这里访问指定命名空间的randprintf(%d\n,Tian::rand);//10printf(%d\n,Tian::Li::rand);//20printf(%d\n,Tian::Nuo::rand);//30}项目中多文件中同名 namespace被认为是一个 namespace不会冲突。突 - C 标准库都放在一个叫 stdstandard的命名空间中。。1.3 命名空间的使用编译查找一个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间里面去查找。可以通过以下三种方式去访问问#includestdio.hnamespaceTian{inta10;}intmain{//编译报错 a未声明标识符printf(%d\n,a);//指定命名空间访问printf(%d\n,Tian::a);// using 将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐这种方式式usingTian::a;printf(%d\n,a);// 展开命名空间中全部成员冲突风险很大)usingnamespaceTian;printf(%d\n,a);return0;}## 二、C 输入 输出出iostream是 Input Output Stream 的缩写是标准的输入、输出流库定义了标准的输入、输出对象。。-cout、cin、endl等都属于 C 标准库C 标准库都放在一个叫stdstandard的命名空间中所以要通过命名空间的使用方式去用它们。。 -std::cin是istream类的对象它主要面向窄字符narrow characters (of type char)的标准输入流。。-std::cout是ostream类的对象它主要面向窄字符的标准输出流。。std::endl 是一个函数流插⼊输出时相当于插入⼀个换行字符加刷新缓冲区。是流插入运算符是流提取运算符。C语言还用这两个运算符做位运算左移/右移。使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动指定格式C的输入输出可以自动识别变量类型C的流能更好的支持自定义类型对象的输入输出。⼀般日常练习中我们可以using namespace std实际项目开发中不建议using namespace std#includeiostreamusingnamespacestd;intmain(){inta0;doubleb0.1;charcx;couta b cendl;// 可以⾃动识别变量的类型cina;cinbc;coutaendl;coutb cendl;return0}在io需求比较高的地方如部分大量输入的竞赛题中加上以下3行代码可以提高CIO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);三、缺省参数- 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参缺省参数分为全缺省和半缺省参数。数- 全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C 规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。。- 带缺省参数的函数调用C 规定必须从左到右依次给实参不能跳跃给实参。。做项目时函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省值。缺参使用示例*#includeiostreamusingnamespacestd;voidFunc(inta0){coutaendl;}intmain(){// 没有传参时使用参数的默认值值Func();//输出0//传参时使⽤指定的实参Func(10);//输出10return0;}#includeiostreamusingnamespacestd;// 全缺省voidFunc1(inta10,intb20,intc30){couta aendl;coutb bendl;coutc cendlendl;}// 半缺省voidFunc2(inta,intb10,intc20){couta aendl;coutb bendl;coutc cendlendl;}intmain{Func1();//102030 60Func1(1);//12030 51Func1(1,2);//1230 33Func1(1,2,3);//123 6Func2(100);//1001020 130Func2(100,200);//10020020 320return0}四、函数重载C 支持在同一作用域中出现同名函数但是要求这些同名函数的形参不同参数个数不同或者类型不同。这样 C 函数调用就表现出了多态行为使用更灵活。。#includeiostream// 参数类型不同usingnamespacestd;intAdd(intleft,intright){countint Add(int left, int right)endl;returnleftright;}doubleAdd(doubleleft,doubleright){coutdouble Add(double left, double right)endl;returnleftright;}//参数个数不同voidf(){coutf()endl;}voidf(inta){coutf(int a)endl;}// 参数类型顺序不同voidf(inta,charb){coutf(int a,char b)endl;}voidf(charb,inta){coutf(char b, int a)endl;}// 返回值不同不能作为重载条件因为调⽤时也⽆法区分//void fxx()//{}////int fxx()//{//return0;//}// 下⾯两个函数构成重载// 但是f1()调⽤时会报错存在歧义既可以匹配无参的f1()也能匹配带默认参数的f1(int a10)//void f1(){// cout f1() endl;//}//void f1(int a 10{// cout f1(int a) endl;//}五、引用引⽤不是新定义⼀个变量而是给已存在变量取了一个别名编译器不会为引⽤变量开辟内存空间它和它引⽤的变量共⽤同⼀块内存空间比如李逵江湖上人称 “黑旋风”林冲外号豹子头头类型 引用别名 引用对象;*intmain(){inta0;// b、c 都是 a 的别名名intba;intcb;// 也可以给别名 b 取别名d 相当于还是 a 的别名名intdb;d;// areturn0;}5.1引用的特性引用在定义时必须初始化引用绑定的对象不能换inta10;intba;intc20;bc;// 这里并非让 b 引用 c因为 C 引用不能改变指向,这里是一个赋值coutaendl;coutaendl;coutbendl;coutcendl;b、c 引用的对象地址一样即绑定对象一样5.2 引用的使用引用在实践中主要用于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。。用引用来实现交换函数可以减少地址拷贝语法更简洁voidSwap(intrx,intry){inttmprx;rxry;rytmp;}这里 ret 是函数局部变量函数运行结束后会销毁。。return ret 时会把 ret 的值拷贝一份到临时变量放到寄存器里再把临时变量的值赋值给外面的 x。缺点产生拷贝大对象时开销大intfunc(){intret0;returnret;}intxfunc();由此可以明白顺序表找下标的方法是将数组对应下标的值拷贝到临时变量里返回同时也无法修改这个临时变量的值因为这个临时变量是纯右值语法规定右值不能作为赋值左操作数*intSLAt(SLsl,inti){returnsl.a[i];// 拷贝元素到临时变量产生副本}SLAt(sl,i)1;// 这个编译会报错左操作数要是左值值修改后return sl. a[i],可以理解为用一个临时引用变量 int tmp sl. a[i]编译器不会真的创建一个名叫 tmp 的变量只是逻辑等价返回的是返回对象的别名这样就可以对数组的数进行修改intSLAt(SLsl,inti){returnsl.a[i];}SLAt(sl,i)1;注意func那里不能把返回值int变成int因为ret是函数局部变量返回他的引用时ret空间已经被销毁了本质是一种类似野指针的行为5.3 指针与引用的关系C 中指针和引用在实践中相辅相成功能有重叠性但是各有自己的特点互相不可替代。。语法概念上引用是一个变量的别名不开空间而指针是存储一个变量地址要开空间。。- 引用在定义时必须初始化指针建议初始化但是语法上不是必须的。。- 引用在初始化时绑定一个对象后就不能再绑定其他的对象了而指针可以不断地改变指向对象。。- 引用可以直接访问指向对象指针需要解引用才是访问指向对象。。指针容易出现空指针或者野指针而引用一般不会因此引用使用起来更安全一些。sizeof(引用)得到的是原数据类型本身的大小但sizeof指针始终是地址空间所占字节个数(32位平台下占4byte64位下是8byte)。六、 const引用在 C 中对象的访问权限在引用过程中可以缩小但是不能放大大constinta10;// a是常量只读不能修改intr1a;// 报错普通引用会修改权限权限放大禁止constintr2a;// 合法const引用只读权限匹配intb20;// b既可读也可写constintrb;// 合法权限可以缩小r100;// 报错r是const引用只读b100;// 合法原变量本身依旧能改int rb a*3;double d 12.34;int rd d;a*3的结果保存在一个临时对象中int rd d也是类似在类型转换中会产生临时对象存储中间值也就是说 rb 和 rd 引用的都是临时对象而 C 规定临时对象具有常性所以这里就触发了权限放大必须要用常引用才可以。。- 所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象C 中把这个未命名对象叫做临时对象象inta10;constintra30;// int rb a * 3; 编译报错a*3 的运算结果会用一个临时对象储存不能用可修改普通引用 int 绑定因为权限不能放大大const int rb a*3; // const int 常引用可以正常绑定定doubled12.34;// int rd d;编译出错因为d 是 double 类型变量引用 rd 是 int类型不匹配编译器会自动隐式转换把 12.34 截断小数生成临时 int 值 12这个 12 是匿名临时对象constintrdd;## 七、 inlinee运行机制使用 inline 修饰的函数称为内联函数编译阶段编译器会将函数代码原地展开省去函数调用时栈帧创建、参数压栈、跳转返回的开销提升程序执行效率。编译器特性仅为建议inline 只是给编译器的优化提示而非强制指令编译器有权忽略展开请求以下场景会直接放弃内联:函数存在递归调用。函数代码量大、逻辑复杂。函数包含循环、分支多的复杂逻辑。C 引入 inline 的核心目的安全替代 C 语言宏函数兼顾代码展开效率与类型安全、可调试性。声明和定义不能分离到两个文件声明时同时写出定义。八、 nullptrNULL 的底层定义- C 语言NULL 是无类型空指针 (void*)0- CNULL 直接等价于整数字面量 0### nullptr 核心特性性是关键字不是宏宏- 只能隐式转换成任意指针类型不能转换成整数数

相关新闻

退款期证据收集法:多节点测速方法论与实操指南

退款期证据收集法:多节点测速方法论与实操指南

退款期证据收集法:多节点测速方法论与实操指南工具地址:https://www.speedce.com 社区论坛:https://bbs.speedce.com 联系:speedceadsgmail.com写在前面 围绕「退款期证据收集法」,本文提供可落地的技术指南&#xff0…

2026/10/20 10:50:24 阅读更多 →
On-Call 前 5 分钟:收到告警后 SpeedCE 怎么测

On-Call 前 5 分钟:收到告警后 SpeedCE 怎么测

On-Call 前 5 分钟:收到告警后 SpeedCE 怎么测工具地址:https://www.speedce.com 社区论坛:https://bbs.speedce.com 联系:speedceadsgmail.com写在前面 本文围绕「On-Call 前 5 分钟」展开,提供可落地的技术方案&…

2026/10/21 8:44:33 阅读更多 →
从零构建HTML5自定义视频播放器:原生API与交互实战

从零构建HTML5自定义视频播放器:原生API与交互实战

1. 项目概述&#xff1a;为什么我们需要自定义 video 控件&#xff1f; 在网页开发中&#xff0c; <video> 标签是嵌入视频内容最直接的方式。浏览器为它提供了一个默认的控制条&#xff0c;包含播放/暂停、进度条、音量、全屏等按钮。这个默认控件简单、通用&#xff…

2026/10/18 8:16:49 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/10/21 9:32:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →