当前位置: 首页 > news >正文

【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;
}

引用

概念及定义

引用是给已存在变量取一个别名,语法层面上编译器不会为其开辟内存空间, 它和引用的变量共用同一块内存空间。(实际底层实现上开辟了空间,是用一个指针指向其引用的变量)
通过调试可以知道:别名和引用的变量指向 共同占用一块空间
反汇编观察 底层:a和b各自开了一块空间,b通过指针ptr指向了变量a

特性及使用

引用在定义时 必须初始化
支持多次引用
引用一个实体,其别名再不能引用其他实体
  • 实践中,引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。
  • 使用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++编译器会在调用的地方展开内联函数,这样调用内联函数就需要建立栈帧了,就可以提高效率。
这个功能是和C语言中的define是类似的,inline又有什么优势呢?
宏函数实现很复杂很容易出错的,且不方调试,C++设计了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只能被隐式地转换为指针类型,而不能被转换为整数类型)
在此代码中,本想通过f(NULL)调用函数f(int x),但运行后发现调用的f(int x)函数,与设计此程序是相违反的。

若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++】基础入门(详解)

&#x1f31f; Hello&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 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&#xff08;非确定性树自动机&#xff09;是一种树形结构装置&#xff0c;该装置内置有一套运行规则&#xff0c;通过这些规则&#xff0c;装置可以产生若干个信号&#xff0c;这些信号组成一个信号系统&#xff0c;在这样的系统中&#xff0c;一个信…...

使用 GPT-SoVITS 克隆声音,很详细

使用 GPT-SoVITS 克隆声音&#xff0c;很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣&#xff0c;但对直接在网站上…...

Flask和Django相比哪个更适合新手?

Flask 与 Django:哪个更适合新手? 对于新手来说,选择 Flask 还是 Django 主要取决于你的具体需求和项目复杂度。以下是两者的详细对比,帮助你做出选择: 1. Flask 优点 简单易用:Flask 是一个轻量级的微框架,代码简洁,易于理解和上手。适合初学者快速入门。灵活性高:…...

2. 图片性能优化

图片性能优化 图片懒加载 如何判断图片出现在了当前视口 &#xff08;即如何判断我们能够看到图片&#xff09;如何控制图片的加载 原生实现 <img src"shanyue.jpg" loading"lazy" />loading"lazy" 延迟加载图像&#xff0c;直到它和视…...

多模态本地部署和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安装官网&#xff1a;Installation Guide - RAPIDS Docs 转载&#xff1a;Linux下cuML库的安装与Jupyter集成调试教程-CSDN博客...

机器学习数学基础:24.随机事件与概率

一、教程目标 本教程致力于帮助零基础或基础薄弱的学习者&#xff0c;全面掌握概率论与数理统计的基础公式&#xff0c;透彻理解核心概念&#xff0c;熟练学会应用解题技巧&#xff0c;最终能够轻松应对期末或考研考试。 二、适用人群 特别适合那些对概率论与数理统计知识了…...

CAS单点登录(第7版)27.开发人员

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 开发人员 Javadocs文档 group org.apereo.cas has published 42 artifact(s) with total 8210 version(s) org.apereo.cas org apereo.cas 小组已出版 42 件作品&#xff0c;共 8210 个版…...

DeepSeek+即梦 做AI视频

DeepSeek做AI视频 制作流程第一步&#xff1a;DeepSeek 生成视频脚本和分镜 第二步&#xff1a;生成分镜图片绘画提示词第三步&#xff1a;生成分镜图片第四步&#xff1a;使用可灵 AI 工具&#xff0c;将生成的图片转成视频。第五步&#xff1a;剪映成短视频 DeepSeek 真的强&…...

OpenMetadata 获取 MySQL 数据库表血缘关系详解

概述 OpenMetadata 是一个开源的元数据管理平台,支持端到端的血缘关系追踪。对于 MySQL 数据库,OpenMetadata 通过解析表的外键约束、视图定义及查询日志(可选)构建表级血缘。本文结合源码分析其实现机制。 环境配置与数据摄取 1. 配置文件示例(YAML) source:type: my…...

计算机组成原理—— 总线系统(十二)

不要害怕失败&#xff0c;因为每一次跌倒都是站起来的前奏&#xff1b;不要畏惧未知&#xff0c;因为在探索的过程中你会发现未曾预见的美好。你的每一步努力都在为未来的成功铺路&#xff0c;即使现在看不到成果&#xff0c;但请相信积累的力量。那些看似平凡的努力&#xff0…...

详解如何使用Pytest内置Fixture tmp_path 管理临时文件

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 临时目录在测试中起着至关重要的作用&#xff0c;它为执行和验证代码提供了一个可控…...

Banana Pi OpenWRT One 官方路由器的第一印象

OpenWRT One是OpenWRT开源社区推出的首款官方开发板&#xff0c;与Banana Pi社区共同设计&#xff0c;由Banana Pi制造和发行。路由器采用蓝色铝合金外壳&#xff0c;质感极佳&#xff0c;视觉效果远超宣传图。整体设计简洁&#xff0c;呈长方形&#xff0c;虽然不是特别时尚&a…...

Golang GORM系列:GORM事务及错误处理

在数据库管理领域&#xff0c;确保数据完整性至关重要。GORM是健壮的Go对象关系映射库&#xff0c;它为开发人员提供了维护数据一致性和优雅地处理错误的基本工具。本文是掌握GORM事务和错误处理的全面指南。我们将深入研究如何使用事务来保证原子性&#xff0c;并探索有效处理…...

NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略

作者&#xff1a;来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型&#xff0c;以及其与 LLM&#xff08;Large Language Model&#xff09;的异同和协同关系。接着…...

ASP.NET Core SixLabors.ImageSharp v1.0 的图像实用程序类 web示例

这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.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 执行退出判断的关键…...

数据结构与算法之排序算法-归并排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; …...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...