【C++】基础入门(详解)


🌟 Hello,我是egoist2023!
🌍 种一棵树最好是十年前,其次是现在!
目录
输入&输出
缺省参数(默认参数)
函数重载
引用
概念及定义
特性及使用
const引用
与指针的关系
内联inline和nullptr
inline
nullptr
输入&输出
前文了解到本贾尼认为C语言是有缺陷的,想弥补其缺陷,最后搞出自己的一套C++体系。其实,C语言的scanf和printf函数是有缺陷且过于冗杂(每次都需要手动指定格式),是否能通过一种方式使输入输出更简便呢?针对此问题在C++中引入了输入&输出流。
- <iostream> (全称: Input Output Stream )是标准的输入、输出流库,定义了标准的输入、输出对象。
- std::cin 是 istream 类的对象,它主要面向窄字符的标准输入流。(C++标准库都封在std的命名空间中)
- std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
- std::endl 是⼀个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区(简单看成C语言中的\n)。
- <<是流插入运算符,>>是流提取运算符。(在C语言还充当左移/右移位运算符)。
- 输入输出可以自动识别变量类型(本质是通过函数重载实现的),最重要的是 C++的流能更好的支持自定义类型对象的输入输出。
#include<iostream>
#include<stdio.h>int main()
{int a = 1;std::cout << a;printf("%d", a);return 0;
}
- IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,因此在此章节只介绍IO流的用法。
- 在vs编译器中<iostream>间接包含了<stdio.h>,因此可以使用printf。
#include<iostream>int main()
{int a = 1;std::cout << a;printf("%d", a);return 0;
}
缺省参数(默认参数)
- 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值。

- 缺省参数分为全缺省(全部形参给缺省值)和半缺省参数(部分形参给缺省值)。
- C++规定半缺省参数必须从左往右依次连续缺省,不能间隔给缺省值。(同理依次给实参)
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。(这样做的目的是避免冲突,因为编译器在链接时会合成制表符,此时,声明和定义都有缺省值就会产生冲突)

-
缺省参数的意义远不止如此,在之前的栈和队列章节中,栈的初始化中capacity默认开始为0。若一开始明确插入1000个数据时,初始化时直接开好,避免多次扩容损失效率。(没有传参时会采用缺省参数的值。)

函数重载
在C语言中若要实现Add函数(需要支持整形、浮点型相加)时,需要保证Add函数名字不冲突,为了解决这一困扰。在C++中,添加了函数重载这个概念,其要求这些同名函数的形参不同,可以是参数个数不同或者类型不同(不支持返回类型不同),呈现多态行为,使用更加方便。函数支持三种类型的重载。
函数重载是C++中实现多态性的一种重要方式,具有重要意义(增强了代码的可读性,函数的通用性和复用性),同时为之后的模板(函数重载的支持)、运算符重载做了铺垫。
参数类型不同
int Add(int x, int y)
{cout << "int Add(int x, int y)" << endl;return x + y;
}double Add(double x, double y)
{cout << "double Add(double x, double y)" << endl;return x + y;
}
参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
参数顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
引用
概念及定义
引用是给已存在变量取一个别名,语法层面上编译器不会为其开辟内存空间, 它和引用的变量共用同一块内存空间。(实际底层实现上开辟了空间,是用一个指针指向其引用的变量)
特性及使用
• 引用在定义时 必须初始化
• 支持多次引用• 引用一个实体,其别名再不能引用其他实体
- 实践中,引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。
- 使用C++引用替代指针传参,目的是简化程序,避开复杂的指针。
- 引用传参和引用作返回值在实践中经常用到,达到了减少拷贝提高效率(指针也可以减少拷贝)和改变引用对象的目的。(针对自定义类型更为明显)
在指针章节中要求交换两个变量,涉及到传址调用(形参改变实参)。同样,使用引用也可以达到此目的。

const引用
变量也有被const修饰的情况,此时对其进行引用会报错(权限被放大了),因此需要引入 const引用。
权限要点 -- > 权限可以平移或者缩小,但一定不能放大。
- 引用一个const对象,必须用const引用。const引用也可以引用普通对象,因为对象的访问权限可以缩小,不能放大。

- 需要注意的是 int& rb = a*3; double d = 12.34; int& rd = d 这种场景下需要使用const引用

这里涉及到类型转换,将double转换为int&为何需要使用const引用呢?
在类型转换中,会产生临时对象(也称未命名对象),这个对象具有常性,此时rb和rd都是引用这个临时变量,权限被放大了,因此会出现报错。
- 临时对象是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象。
与指针的关系
由上文可以发现引用与指针的部分功能是类似的,那为什么本贾尼还引入了引用这个语法呢?
引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。如:C++引⽤定义后不能改变指向,相反地指针可以改变指向(链表章节中指针定义的结构是不能用引用替代的)。
| 引用 | 指针 |
| 语法上不开空间 | 要开空间存储变量地址 |
| 必须初始化 | 非必须初始化 |
| 不能改变指向 | 可以改变指向 |
| 可以直接访问指向对象 | 需要借助*访问指向对象 |
| 引用结果为引用类型大小 | 看32位/64位平台 |
| \ | 野指针和空指针问题 |
内联inline和nullptr
inline
inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就需要建立栈帧了,就可以提高效率。
#define Add(x,y) ((x)+(y))
inline int Add(const int& x, const int& y)
{
return x + y;
}
在实现Add函数中使用define宏定义时需要考虑各种因素,而使用inline则无需顾虑很多,让编译器决定是否展开此函数。
- inline对于编译器是一个建议(选择性展开),适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline也会被编译器忽略。
- inline不建议声明和定义分离到两个文件 ,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错(不能合成制表符)。
- vs编译器 debug版本下面默认是不展开inline的,因此需要设置下。


nullptr
引入nullptr实际是为了替代C语言的NULL(有缺陷)。
NULL实际是一个宏,在头文件(stddef.h)中。
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
C++中NULL可能被定义为 常量0 ,或者C中被定义为 无类型指针(void*) 的常量。但都不可避免的会遇到一些麻烦。nullptr(关键字)是⼀种特殊类型的字面量,它可以转换成任意其他类型的指针类型。使用 nullptr定义空指针可以避免类型转换 的问题。(nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型)
若NULL为无类型指针(void*)呢?运行后会报错,这是因为2个函数重载中没有一个能转换所有参数类型。
#include<iostream>
using namespace std;void f(int x)
{cout << "f(int x)" << endl;
}void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}int main()
{f(NULL);//调用f(int x)f(nullptr);//调用f(int* ptr)f((void*)0);//errreturn 0;
}

相关文章:
【C++】基础入门(详解)
🌟 Hello,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…...
Base64 PDF解析器
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Base64 PDF解析器</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}.contain…...
ZOJ 1011 NTA
原题目链接 1011 NTA NTA(非确定性树自动机)是一种树形结构装置,该装置内置有一套运行规则,通过这些规则,装置可以产生若干个信号,这些信号组成一个信号系统,在这样的系统中,一个信…...
使用 GPT-SoVITS 克隆声音,很详细
使用 GPT-SoVITS 克隆声音,很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣,但对直接在网站上…...
Flask和Django相比哪个更适合新手?
Flask 与 Django:哪个更适合新手? 对于新手来说,选择 Flask 还是 Django 主要取决于你的具体需求和项目复杂度。以下是两者的详细对比,帮助你做出选择: 1. Flask 优点 简单易用:Flask 是一个轻量级的微框架,代码简洁,易于理解和上手。适合初学者快速入门。灵活性高:…...
2. 图片性能优化
图片性能优化 图片懒加载 如何判断图片出现在了当前视口 (即如何判断我们能够看到图片)如何控制图片的加载 原生实现 <img src"shanyue.jpg" loading"lazy" />loading"lazy" 延迟加载图像,直到它和视…...
多模态本地部署和ollama部署Llama-Vision实现视觉问答
文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…...
cuML机器学习GPU库
cuML安装官网:Installation Guide - RAPIDS Docs 转载:Linux下cuML库的安装与Jupyter集成调试教程-CSDN博客...
机器学习数学基础:24.随机事件与概率
一、教程目标 本教程致力于帮助零基础或基础薄弱的学习者,全面掌握概率论与数理统计的基础公式,透彻理解核心概念,熟练学会应用解题技巧,最终能够轻松应对期末或考研考试。 二、适用人群 特别适合那些对概率论与数理统计知识了…...
CAS单点登录(第7版)27.开发人员
如有疑问,请看视频:CAS单点登录(第7版) 开发人员 Javadocs文档 group org.apereo.cas has published 42 artifact(s) with total 8210 version(s) org.apereo.cas org apereo.cas 小组已出版 42 件作品,共 8210 个版…...
DeepSeek+即梦 做AI视频
DeepSeek做AI视频 制作流程第一步:DeepSeek 生成视频脚本和分镜 第二步:生成分镜图片绘画提示词第三步:生成分镜图片第四步:使用可灵 AI 工具,将生成的图片转成视频。第五步:剪映成短视频 DeepSeek 真的强&…...
OpenMetadata 获取 MySQL 数据库表血缘关系详解
概述 OpenMetadata 是一个开源的元数据管理平台,支持端到端的血缘关系追踪。对于 MySQL 数据库,OpenMetadata 通过解析表的外键约束、视图定义及查询日志(可选)构建表级血缘。本文结合源码分析其实现机制。 环境配置与数据摄取 1. 配置文件示例(YAML) source:type: my…...
计算机组成原理—— 总线系统(十二)
不要害怕失败,因为每一次跌倒都是站起来的前奏;不要畏惧未知,因为在探索的过程中你会发现未曾预见的美好。你的每一步努力都在为未来的成功铺路,即使现在看不到成果,但请相信积累的力量。那些看似平凡的努力࿰…...
详解如何使用Pytest内置Fixture tmp_path 管理临时文件
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 临时目录在测试中起着至关重要的作用,它为执行和验证代码提供了一个可控…...
Banana Pi OpenWRT One 官方路由器的第一印象
OpenWRT One是OpenWRT开源社区推出的首款官方开发板,与Banana Pi社区共同设计,由Banana Pi制造和发行。路由器采用蓝色铝合金外壳,质感极佳,视觉效果远超宣传图。整体设计简洁,呈长方形,虽然不是特别时尚&a…...
Golang GORM系列:GORM事务及错误处理
在数据库管理领域,确保数据完整性至关重要。GORM是健壮的Go对象关系映射库,它为开发人员提供了维护数据一致性和优雅地处理错误的基本工具。本文是掌握GORM事务和错误处理的全面指南。我们将深入研究如何使用事务来保证原子性,并探索有效处理…...
NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…...
ASP.NET Core SixLabors.ImageSharp v1.0 的图像实用程序类 web示例
这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 1.0.4)添加到.NET Core 3.1/ .NET 6 / .NET 8项目中。它与Windows、Linux和 MacOS兼容。 这已针对 ImageSharp v3.0.1 进行了重新设计。 它可以根据百万像素数或长度乘以宽度来调整图像大…...
ffmpeg configure 研究1-命令行参数的分析
author: hjjdebug date: 2025年 02月 14日 星期五 17:16:12 CST description: ffmpeg configure 研究1 ./configure 命令行参数的分析 文章目录 1 configure 对命令行参数的分析,在4019行1.1 函数名称: is_in1.2. 函数名称: enable1.3. 函数名称: set_all 2 执行退出判断的关键…...
数据结构与算法之排序算法-归并排序
排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来: …...
JavaScript 打开小窗口的实现方法
function openCenteredWindow(url ) {const width 600;const height 400;// 计算居中位置const left Math.round((screen.width - width) / 2);const top Math.round((screen.height - height) / 2);window.open(url,"_blank",width${width},height${height},lef…...
5分钟搞懂BERT tokenizer:用encode_plus为你的NLP模型准备‘标准餐’(附PyTorch/TF代码适配)
5分钟搞懂BERT tokenizer:用encode_plus为你的NLP模型准备‘标准餐’(附PyTorch/TF代码适配) 想象一下,你正在为一位挑剔的米其林大厨准备食材——每一片蔬菜的厚度、每一块肉的纹理都必须精确到毫米级。在自然语言处理࿰…...
给车载摄像头选镜头?先搞懂这5个光学参数,别再被供应商忽悠了
车载摄像头镜头选型实战指南:5个关键光学参数与供应商谈判技巧 在智能驾驶和车载视觉系统快速发展的今天,选择一款合适的车载摄像头镜头远比大多数人想象的复杂。作为一位经历过数十次供应商谈判的技术选型负责人,我见过太多团队因为对光学参…...
基于本地AI与向量数据库的智能书签管理系统实战
1. 项目概述:当书签管理遇上AI智能如果你和我一样,是个重度网络冲浪者,或者从事需要大量信息检索的工作,浏览器收藏夹(书签)大概率已经成了一个“数字黑洞”。我敢打赌,你的书签栏里塞满了各种链…...
md-emoji-mcp:让Markdown文档变生动的表情包注入工具
1. 项目概述:一个让技术文档“活”起来的表情包注入器作为一名长期与技术文档打交道的开发者,我深知一个痛点:我们写的技术文章、项目说明,往往因为过于严谨和“干巴巴”而显得枯燥。读者在阅读长篇的配置说明或原理阐述时&#x…...
STM32F103的CAN通信,从汽车电子到你的开发板:一个完整的数据收发实战
STM32F103的CAN通信实战:从硬件搭建到自定义协议设计 当你第一次把玩STM32F103开发板时,可能不会立刻想到它和汽车电子之间的联系。但事实上,这颗看似普通的MCU搭载的CAN控制器,与奔驰、宝马等豪华车系中使用的通信协议师出同门。…...
OWASP LLM Top 10安全风险深度解析与实战防护指南
1. 项目概述:当LLM应用安全成为必答题最近几年,大语言模型(LLM)应用像雨后春笋一样冒出来,从智能客服、代码助手到内容创作,几乎无处不在。作为一名在应用安全领域摸爬滚打了十多年的老兵,我亲眼…...
FPGA与PC高速数据通道:基于FTDI同步FIFO的实战设计
1. 项目概述:一个连接FPGA与PC的“高速数据通道”如果你玩过FPGA,肯定遇到过这个头疼的问题:调试时,怎么把板子上的海量数据快速、稳定地传到电脑上?用串口?速度太慢,115200的波特率传一张小图片…...
基于Flask与Vercel的ChatGPT Line机器人开发与部署指南
1. 项目概述:一个部署在Vercel上的Python Flask ChatGPT Line机器人最近在折腾聊天机器人,发现了一个挺有意思的项目:用Python Flask框架,把ChatGPT的能力集成到Line(一款流行的即时通讯应用)里,…...
AI 模型本地化部署
一、什么是 AI 模型本地化部署? 就是:把大模型 / AI 程序从云端服务器,搬到你自己的电脑、服务器、设备上运行。 特点: 不联网也能用数据不上传,隐私安全速度更快、无费用可完全自定义 常见用途: 本地…...
