并非从0开始的c++ day13

拆解大疆Osmo Pocket:聊聊微型云台里那几根比头发丝还细的线,以及它为啥一开机就‘摇头晃脑’ 本文深入拆解大疆Osmo Pocket微型云台的精密硬件结构,揭秘其开机自检时‘摇头晃脑’的奥秘。通过分析无刷电机、霍尔传感器和46AWG同轴线等核心组件,展现了大疆在微型云台设计中的工程智慧与创新技术,特别是FOC控制和陀螺仪的应用,实现了0.1°级的姿态控制精度。 阅读详情

引用

引用基本用法

引用是C++对C的重要扩展。在C/C++中指针的作用基本都是一样的,但是C++增加了另外一种给函数传递地址的途径,这就是按引用传递,它也存在于其他一些编程语言中,并不是C++的发明
引用和C语言的指针一样的功能,并且使语法更加简洁

  • 变量名实质上是一段连续内存空间的别名,是一个标号
  • 程序中通过变量来申请并命名内存空间
  • 通过变量的名字可以使用存储空间
void test01()
{
	int a = 10;
	int& b = a;//给变量a取别名b

	b = 100;
	cout << a << endl;
}

作为形参时可以这样用

void func(int& a)
{
	a = 200;
}

void test02()
{
	int a = 10;

	func(a);

	cout << a << endl;
}

引用注意事项

  • &在这里并不是取地址操作,而是起到 标志性的作用
  • 引用创建时,必须初始化。 int &pRef ; err
  • 引用一旦初始化不能改变它的指向
  • 引用必须引用一块合法的内存空间

数组的引用

int arr[] = { 1,2,3,4,5 };
//第一种方法
//1. 定义数组类型
typedef int(MY_ARR)[5];//数组类型
//2.建立引用
MY_ARR& arref = arr;//建立引用,int &b = a;

//第二种方法
//直接定义引用
int(&arref2)[5] = arr;//int &b = a;

//第三种方法
typedef int(&MY_ARR3)[5];//建立引用数据类型
MY_ARR3 arref3 = arr;

一般最常用第二种方法,其次第一种方法

访问可以用以下方法

for (int i = 0; i < 5; i++)
{
	cout << arref[i] << endl;
}
cout << endl;
for (int i = 0; i < 5; i++)
{
	arref2[i] = 100 + i;
	cout << arref2[i] << endl;
}

引用的本质

引用的本质在C++内部实现是一个常指针

Type& ref = val;//Type* const ref = &val ;

C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见

int a = 10;
int& aRef = a;//自动转换为int* const aRef = &a;
aRef = 20;//内部发现aRef是引用,自动帮我们转换为:*aRef = 20;

const 和#define 区别总结

  1. const 有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查
  2. const有作用域,而#define不重视作用域,默认定义处到文件结尾。如果定义在指定作用域下有效的常量,那么#define就不能用。
#define MA 128
const short ma = 128;

void func(short int a)
{
	cout << "func(short int a)" << endl;
}

void func(int a)
{
	cout << "func(int a)" << endl;
}

输入参数为ma时,可以检查数据类型

指针的引用

void test01()
{
	const char* p = "翠花";
	const char*& p1 = p;
	cout << p1 << endl;
}

具体过程:

  1. 在字节常量区找到字符串“翠花”,令指针p指向它
  2. 初始化一个指针&p1,把p赋值给它,经过解引用,p指向的内容将被赋值给p1
  3. 这时输出p1,就会输出翠花
//被调函数
void func(char *& temp)
{
	char* p;
	p = (char*)malloc(64);
	memset(p, 0, 64);
	strcpy(p, "小花");
	temp = p;  //省了*
}


//主调函数
void test02()
{
	char* mp = NULL;
	func(mp);//省了&
	cout << mp << endl;
}

同理,使用引用在栈区上直接将上述p指向的值赋值给temp(mp),使输出时,输出了想要的结果
对比c语言的形参指针修改指向内容,在代码上减少了取地址等操作,使代码更简洁易懂

C和C++的区别

  1. C语言的结构体不能写函数,C++可以
  2. 结构体定义变量时,C++不需要加struct关键字
  3. 更加严格的类型检查
  4. const修饰的变量,C++有时没有内存,C语言的都有内存
  5. 三目运算符返回的值不一样
  6. 引用和C语言的指针功能一致

引用的使用场景

  1. 引用作为函数参数
void func(int& a, int& b)
{
	int sum = a + b;
	cout << "sum=" << sum << endl;
}

void test01()
{
	int a = 10;
	int b = 20;
	func(a, b);
}
  1. 引用作为函数的返回值后
int& func2()
{
	int b = 10;//不要返回局部变量的引用
	int& p = b;
	return p;
}

int& func3()
{
	static int b = 10;
	return b;
}

void test02()
{
	int& q = func2();
	q = 100;
	cout << q << endl;

	func2() = 200;
	cout << q << endl;
	cout << "func2()=" << func2() << endl;

	func3() = 100;
	cout << "func3()=" << func3() << endl;
}

在fun2中,直接访问fun2能得到局部变量b的值,但是通过在主调函数test02中,使用引用q来修改这个值时,可以发现其实是修改不了的,在第3次输出的时候,依然是10,这里应该是个bug,但是vs不会报错,在linux里会报错

在func3中,在声明局部变量b时,使用static关键字修饰,就可以将这个变量变为静态,在编译时分配空间,在外部可以修改

如果要函数当左值,你们该函数必须返回引用

常量的引用

常量引用的定义格式:

const Type& ref = val;

常量引用注意:

  • 字面量不能赋给引用,但是可以赋给const引用
  • const修饰的引用不能修改
//普通的引用
int a = 10;
int& ref = a;
ref = 20;
//int& ret2 = 10; 不能给字面量取别名  err

const int& ref3 = 10;//可以给const修饰的引用赋予字面量
//const修饰符修饰的引用的原理
//编译器会把上面的代码变为:int temp = 10; const int &ref3 = temp;
//ref3 = 200; err

bool类型

bool类型定义的变量只有两个值,true和false,真和假,1和0


bool is = 1;//注意:is除0以外,都是真
if (is)
{
	cout << "真" << endl;
}
else
{
	cout << "假" << endl;
}

内联函数

宏函数的缺陷

#define ADD(x,y) x+y
void test()
{
	//10 + 20 * 2
	int ref = ADD(10, 20) * 2;
	cout << "ref = " << ref << endl;
}

宏函数这里不检查语法,直接在调用时替换,所以没有提前考虑括号等符号优先级

在普通函数前面加上inline 是向编译器申请成为内联函数

inline int Add(int x, int y)
{
	return x + y;
}

内联函数对比宏函数,速度更快,效率更高
但是inline只是申请成为内联函数,不一定真的成为内联函数,只是加大成为内联函数的概率,同时,如果在代码中调用某一函数过多,该函数有可能成为内联函数,所以内联函数是不可控的,成为内联函数是由编译器来规定的。

int ref2 = Add(10, 20) * 2;
cout << "ref2 = " << ref2 << endl;

输出的结果为60,所以内联函数是检查语法的,并且重视了自己的符号优先级

#define COMAPD(x,y) ((x)<(y)?(x):(y))

void test02()
{
	int a = 1;
	int b = 4;
	cout << "COMAPD(x,y) = " << COMAPD(++a, b) << endl;
}

宏函数缺陷2 ,这里输出时,会先++a后跟b比较,比较a小,所以输出的是++a,于是输出结果为3,并不是1或者2

如果换成内联函数,则输出的结果为2,只会在传入参数时,++一次

inline int func(int x, int y)
{
	return x < y ? x : y;
}

cout << "func = " << func(++a, b) << endl;

什么情况不会成为内联函数

  1. 存在过多的条件判断语句
  2. 函数体过大
  3. 对函数进行取地址操作
  4. 不能存在任何形式的循环语句

内联函数的好处

  1. 有宏函数的效率,没有宏函数的缺点
  2. 类的成员函数默认加上inline
  3. 如果内联函数是成员函数,对象this指针也会被放入合适位置
  4. 类型检查和类型转换、包括在合适位置放入对象this指针这些都是预处理器不能完成的
智慧安防:基于Java+YOLOv8的视频AI识别平台设计与实现 张工,我们的园区智慧安防项目又出问题了!用Python写的YOLOv8 demo,拉3路RTSP流就卡,视频延迟超过5秒,入侵检测误报率太高,一到晚上光线差就全是误报,而且和我们的Java安防平台对接太麻烦,还要搭个消息队列,架构复杂得要死!“别慌,用Java+YOLOv8啊! 阅读详情

相关推荐

图片处理助手|C++ 手搓离线 AI 涂鸦工坊,BiSeNet 分割 + 11 步风格化一次讲透

一条别人没做的链路:照片 → 人脸分割 → 风格化 → 贴纸画布,全离线;AI 只干最贵的活:BiSeNet 跑一次出类图,剩下的交给 11 步经典视觉算子,滑条级实时预览;细节靠传统算法堆:手绘感(模糊+阈值+噪声)、水彩感(距离变换渗色)、像素风(最近邻缩放)——没有第二张「魔法」网络,全是 OpenCV 老伙计;交互即产品:拖拽/缩放/旋转/置顶/去背/泊松融合,贴纸的手感就是体验。后续展望:风格化流水线参数化做成「风格预设」(一键切换水墨风/蜡笔风);泊松融合增加交互式中心点选择;

qq_29676069的博客 284

C++ Practical-2 day13 输出格式

你可以编写自己的函数来格式化货币字符串。

wesigj的博客 958

图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透

现象:边缘微调滑到最左(强腐蚀),点融合,程序崩溃或花屏。原因:掩码被腐蚀成全零,对全零掩码是未定义行为。解决守卫,跳过该贴纸并写日志(第五章代码)。原理一句话:内部保梯度、边界锚颜色,解一个泊松方程,接缝就没了;三模式 = 引导场的三种选法:NORMAL 全搬、MIXED 搬纹理、MONO 只搬纹理走向;工程细节决定手感:掩码膨胀留缓冲、腐蚀去白边、全零守卫、出界跳过、变换后重二值化;缓存换体验:三模式一次算完,切换零等待。

qq_29676069的博客 351

Day13 C++指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。在这里,type是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。int *ip;/* 一个整型的指针 */double *dp;/* 一个 double 型的指针 */float *fp;/* 一个浮点型的指针 */

weixin_47558943的博客 940

C++从零开始(day13)——字符串相关题目3

首先我们要知道,cin读取时,遇到空格或者回车结束,而题目明显要读取带有含空格的字符串,显然我们不能用cin,于是我们使用getline这个函数来配合string读取带空格的字符串,其次,这个题目的思路和上面差不多,也是计数思想

2301_80764270的博客 3242

剑指Offer(数据结构与算法面试题精讲)C++版——day13

剑指Offer(数据结构与算法面试题精讲)C++版——day13 题目一:矩阵中的最大矩形 题目二:滑动窗口的平均值 题目三:最近请求次数 附录:源码gitee仓库

weixin_46560512的博客 2175

QT聊天项目DAY13

掌握如何使用样式表的方式自定义控件; 掌握动态多态,由于注册窗口和忘记密码窗口有很多代码可以复用,并且有些槽函数是可以重写的,以及信号可以从基类继承,对于相同的逻辑可以在父类中写,子类中基于父类的实现接着实现; 服务器中添加处理重置密码的请求以及相关的MysqlAPI; 项目重新更换电脑环境;

yumianxiaolangju的博客 1178

​​​​​​​​48days强训——day13

每日算法,值得一看

2302_80262940的博客 806

【35天从0开始备战蓝桥杯 -- Day1】

本文是蓝桥杯备赛35天计划的入门指南,主要面向编程新手。内容涵盖C++基础语法、数据类型、变量常量、运算符、类型转换等核心知识,并提供配套练习题。文章采用通俗易懂的语言讲解编程概念,如main函数作为程序入口、cout/cin的输入输出用法、变量作用域等。特别强调通过大量练习巩固知识,推荐使用洛谷和牛客网的题目资源。此外,还介绍了printf/scanf等C语言函数作为补充,并详细讲解了cout的格式化输出技巧。全文旨在帮助零基础学习者在35天内系统掌握C++编程基础,为算法学习打下坚实基础。

小年糕的博客 3195

C++】 —— 笔试刷题day_13

刷题day13

LH__1314的博客 1239

day 13练习

关键在于计算具体某一年某一个月的13号距离1900.1.1的天数是多少,然后将其用7来取余,得到最终想要的结果。可以先计算每个月有多少天,若计算某个月13日,那先算出这个月前面的月数的天数之和,再另外加13就可以了。直接创建一个数组,注意数组的大小比道路的长度多1,多一个点,然后将地铁区域的点记为1,统计为0的点就是剩下数的数目;对于未知数组大小不可以用s[l]这样是不允许的#include<vector>,vector<int> s(L+1,0)创建一个数组/列表表示所有人,标记是否被淘汰;

2201_75733977的博客 565

从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽

Tkinter 布局助手”,是我接触过的基于python原生的图形界面套件Tkinter来做GUI程序的最佳实践,链接是https://www.pytk.net/],在web上就可以拖拽基础控件到面板,并定义控件的回调函数,完了存盘到本机。我曾经死抱着CVI不放,没有去追逐更现代的IDE,究其原因,主要是以前没有 AI 辅助编程,很多新 IDE 摸都不敢摸,随便一个编译报错或环境配错,就会卡死我半天。所以,遇到我这样,时不时输出一个学习心得的老工程师,也应该算是一种缘分了,很罕见的哦。

qq_15084199的博客 248

EUI-NEO C++ 轻量跨平台 GUI

EUI-NEO是一个轻量级跨平台GUI框架,基于C++17开发,支持CMake和Xmake构建系统。核心特性包括:支持OpenGL渲染(默认)、模块化设计、声明式UI语法,并提供GLFW/SDL2窗口后端选项。项目结构清晰,包含核心DSL引擎、可复用组件、示例应用及可选功能模块(如键盘/串口支持)。开发者可通过简单配置快速集成,支持find_package和FetchContent方式引入。框架采用Apache 2.0许可证,部分依赖项遵循各自开源协议。文档覆盖DSL设计、状态管理、渲染管线等关键技术细节,

a111776的博客 197

MSE / Cross‑Entropy / Huber / Focal Loss深度实战|损失函数数学原理、PyTorch踩坑、项目选型与排障

深度学习训练loss不下降、震荡、精度上不去,很多时候不是网络结构问题,而是损失函数选择错误。本文结合论文理论与图像分类、目标检测、回归任务线上调参经验,完整拆解MSE、交叉熵、Huber、Focal Loss四大损失函数数学本质;梳理PyTorch原生API高频踩坑;给出Huber的delta、Focal Loss的\(\gamma\)工业调参方案;提供任务选型决策表、训练故障排查清单;附带可运行梯度对比实验代码,帮助开发者根据任务、噪声、样本不平衡快速选对损失函数。

分享日常学习生活 463

VS Code C/C++ 插件 cpptools 内存占用异常

使用VS code连接WSL经常性出现终端和IDE卡住无法使用,关闭VS后即正常。

weixin_56637649的博客 232

ReactOS 图形系统分析(48):弧线绘制 — arc.c

arc.c是 win32k(内核态 GDI)中负责弧线绘制的模块,实现了 Windows 的ArcArcToChordPieAngleArc五个 API 的内核部分。整个模块只包含两个系统调用入口()和三个内部函数(、静态的IntArc),全部代码 408 行。应用层(user32 / gdi32)│├─ ArcTo() ──→ NtGdiArcInternal(GdiTypeArcTo, ...) │ 用户态包装│ 经 win32u.dll 进入内核▼│ arc.c ││ │ │。

大坡3D软件开发 225

对于C++:文件IO流(fstream)的详细解析

本文详细介绍了C++中的文件IO流(fstream),包括三种文件流类型:ifstream(只读)、ofstream(只写)和fstream(读写)。重点讲解了文件打开机制、文本与二进制模式的区别、文件指针操作、缓冲管理、错误处理以及性能优化等内容。文章通过大量示例代码演示了文件流的基本操作、常见陷阱和最佳实践,如RAII自动管理资源、类型安全读写、批量操作提升性能等。最后强调了文件流作为C++I/O体系基础的重要性,是让数据持久化的关键技术。

2503_92929084的博客 369

C++ 面试真题】27. 聊聊 C++ 的内存泄漏与内存布局

"线上进程内存一直涨,怎么查?"——这是工程里最真实的内存问题。查泄漏绕不开进程的内存布局:数据在哪个区、泄漏发生在哪、工具看见的是什么。背得出"new 了没 delete"只是及格,真考你的是"**一张完整的布局图、泄漏的判定标准、AddressSanitizer 和 valgrind 怎么用、free 之后内存去哪了**"。本文把泄漏排查和内存布局合起来讲透。

码工许师傅 424

C++ 】map/set使用精讲:常见问题与典型用法(下)

1、map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。2、在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。;3、在内部,map中的元素总是按照键值key进行比较排序的。4、map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

2501_93641778的博客 211

C语言标准库

一、一些概念 1.C标准库(C Standard Library) 是ISO C标准规定的一组头文件 + 函数库,提供可移植的基础能力,俗称libc。

clerly的博客 236

IB Specification Vol 1-Release-1.9-Draft-2024-08-31

IB Specification Vol 1-Release-1.9-Draft-2024-08-31

上一篇: 并非从0开始的c++ day12
下一篇: 并非从0开始的c++ day14
mcyuuji
博客等级 码龄6年 307粉丝 122原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值