c++(入门)
1. 引用
引用的定义
引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。
引用的语法
引用的声明方式是在变量名前加上&
符号。
引用的特点
- 引用必须在声明时初始化。
- 引用一旦初始化后,就不能再引用其他变量。
- 引用不是独立的变量,它和它引用的变量实质上是同一个变量。(底层上是指向同一个变量的指针)
引用的使用场景
- 作为函数参数,实现参数的按引用传递,允许函数直接修改传入的参数。
- 用于简化复杂对象的操作。
基本引用
int main() {int a = 10;int &ref = a; // ref是a的引用ref = 20; // 通过引用修改a的值std::cout << a << std::endl; // 输出20,因为a的值被ref修改了return 0;
}
引用作为函数参数
void swap(int &x, int &y) {int temp = x;x = y;y = temp;
}int main() {int a = 10, b = 20;swap(a, b); // 交换a和b的值std::cout << "a: " << a << ", b: " << b << std::endl; // 输出 a: 20, b: 10return 0;
}
引用返回局部变量
需要注意的是,返回局部变量的引用是不安全的,因为局部变量在函数返回后其生命周期就结束了。
int &getValue() {static int value = 10; // 使用静态变量来保证生命周期return value;
}int main() {int &ref = getValue(); // 获取引用ref = 20; // 修改引用std::cout << getValue() << std::endl; // 输出20,因为value被修改了return 0;
}
由于value
是静态变量,它的生命周期不会在getValue
函数调用结束后结束,因此返回它的引用是安全的。如果value
不是静态变量,那么返回它的引用将导致未定义行为。
2. 内联函数
内联函数的定义
内联函数是一种特殊的函数,它在编译时会在每个调用点处展开函数体,从而避免了函数调用的开销。但是,是否真正内联由编译器决定。
内联函数的语法
在C++中,内联函数通过在函数定义前加上inline
关键字来声明。
内联函数的特点
- 内联函数通常用于频繁调用且函数体较小的场合。
- 内联函数可以节省函数调用的开销,但可能会增加编译后的代码大小。
- 内联函数对于编译器来说只是一个建议,编译器可能会忽略这个建议。
使用内联函数的注意事项
- 不要将过于复杂的函数声明为内联,因为这将导致代码膨胀。
- 构造函数和析构函数通常不应该声明为内联,除非它们非常简单。
inline int add(int a, int b) {return a + b;
}int main() {int result = add(3, 4); // 在这里,编译器可能会将add函数体展开std::cout << "Result: " << result << std::endl; // 输出 Result: 7return 0;
}
add
函数被声明为内联。当编译器编译main
函数时,它可能会将add(3, 4)
替换为3 + 4
,这样就避免了函数调用的开销。
需要注意的是,内联函数的定义应该放在头文件中,因为内联函数需要在每个调用点展开,所以编译器需要在每个包含该头文件的源文件中看到函数的定义。如果内联函数的定义放在源文件中,可能会导致链接错误。
3. auto关键字(C++11)
auto的自动推导类型
auto
关键字告诉编译器自动推导变量的类型。- 这使得代码更加简洁,尤其是在处理复杂类型或长类型名称时。
auto
可以用于声明变量、函数返回类型、lambda表达式的参数等。
auto var = value; // 编译器会根据value的类型自动推导var的类型
使用auto
时,应确保类型推导的结果是清晰和预期的,避免不必要的混淆。不能用于函数参数的类型推导,因为函数参数需要在函数声明时就确定类型。
4. 基于范围的for循环(C++11)
基本语法
for (declaration : expression) {// 循环体
}
expression
是你要遍历的序列(如数组、容器等),而declaration
用于在每次迭代中声明一个变量,该变量将被初始化为序列中的下一个元素。
遍历数组
int arr[] = {1, 2, 3, 4, 5};
for (int i : arr) {std::cout << i << std::endl; // 输出数组中的每个元素
}
遍历容器
std::vector<double> vec = {1.1, 2.2, 3.3, 4.4, 5.5};
for (double val : vec) {std::cout << val << std::endl; // 输出vector中的每个元素
}
遍历字符串
std::string str = "Hello, World!";
for (char ch : str) {std::cout << ch; // 输出字符串中的每个字符
}
std::cout << std::endl;
在基于范围的for循环中,如果你需要修改元素的值,你应该使用引用(如int&
或auto&
)来避免不必要的复制。如果你不希望修改元素,可以使用常量引用(如const int&
或const auto&
)。如果元素类型是一个类类型,并且没有定义移动构造函数或移动赋值运算符,使用引用可以避免调用复制构造函数或复制赋值运算符,从而提高性能。
5. 指针空值---nullptr(C++11)
在C++11标准中,nullptr
关键字被引入作为新的空指针常量。在此之前,C++程序通常使用NULL
或0
来表示空指针。然而,这两种方法都有其缺点:
NULL
在C++中被定义为整数0,但在某些情况下可能会导致类型不匹配的问题,尤其是当重载函数同时接受整数和指针参数时。- 直接使用数字
0
同样存在类型不匹配的问题,并且代码的可读性较差。
nullptr
的引入解决了这些问题,它是一个特殊的字面量,类型为std::nullptr_t
,它可以被隐式转换为任何指针类型或成员指针类型,但不能被转换为任何整数类型。
int* ptr = nullptr; // 正确:nullptr可以赋值给整型指针
double* dptr = nullptr; // 正确:nullptr可以赋值给双精度浮点型指针
void func(int*) {}
void func(int) {}func(nullptr); // 调用func(int*),而不是func(int)class MyClass {
public:void memberFunc(int*) {}
};MyClass obj;
obj.memberFunc(nullptr); // 正确:nullptr可以传递给成员函数的指针参数
相关文章:

c++(入门)
1. 引用 引用的定义 引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...

【优选算法】前缀和
目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…...

Spring Bean 的生命周期详解
所谓万物皆对象,对于一个 bean 而言,从出生到死亡,他要经历哪些阶段呢? 生命周期 理解对象的生命周期,可以帮助我们更好的做一些扩展。 一个对象从被创建到被垃圾回收,可以大致分为这 5 个阶段:…...

MySQL【知识改变命运】12
视图 1:什么是视图2:创建视图使用视图(视图的好处)2.1.隐藏敏感字段2.2.对外提供统一访问3:视图和真实表进⾏表连接查询 4:修改视图数据4.1:通过真实表修改数据,会影响视图4.2&#…...

shell编程(完整版)
目录 一、shell脚本解释器 二、shell脚本的执行 三、变量的使用 四、永久环境变量 按用户设置永久环境变量 文件路径: 示例步骤: 删除永久环境变量 五、脚本程序传递参数怎么实现 六、用编程进行数学运算 shell中利用expr进行运算 运算与变量…...

数字逻辑(一)——导论
1.导论 1.1什么是数字逻辑? 数字逻辑是指在数字电路设计、计算机科学领域中对于离散的二进制信号进行逻辑处理、运算、存储和传输的基本原理和方法。 1.2数字量和模拟量的区别 数字量:在时间上和数量上都是离散的、不连续的物理量。模拟量࿱…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

《线性代数的本质》
之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…...

Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限
Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限 普通安装实例创建数据库以后,DBA权限只有gbasedbt用户。gbasdbt可以创建普通用户,并且给普通用户赋予库及权限或者表级权限。 但是gbasedbt用户口令和操作系统相关,所以想在不提供gbasedbt的…...

24/11/25 视觉笔记 深度传感器和手势识别
本章的目的是开发一个应用程序,使用深度传感器的输出实时检测和跟踪简单的手势。该应用程序将分析每个已捕捉的帧。并执行以下任务。 手部区域分割:通过分析Kinect传感器的深度图输出,在每一帧中提取用户的手部区域,这是通过阈值…...

迄今为止的排序算法总结
迄今为止的排序算法总结 7.10 迄今为止的排序算法总结复杂度和稳定性时间复杂度测试程序sortAlgorithm.hsortAlgorithm.cpptest.cpp 时间复杂度测试结果 7.10 迄今为止的排序算法总结 复杂度和稳定性 排序算法平均情况最好情况最坏情况稳定性空间复杂度选择排序O(n^2)O(n^2)O…...

HTML和CSS 表单、表格练习
HTML和CSS 表格练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML表格练习</title>…...

H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案
随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js网页直播/点播播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。…...

Http 转 https 中 Nginx 的详细配置过程
摘要 本节将简要介绍从 HTTP 到 HTTPS 的配置过程,并完整展示 Nginx 的相关配置信息。 经过两天断断续续的调试,终于将 http 变成 https 了。现在说说这个安装 ssl 证书的过程。 服务器是在某云上。这个过程大致分为三个步骤:申请 ssl 证书、…...

【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…...

Otter 安装流程
优质博文:IT-BLOG-CN 一、背景 随着公司的发展,订单库的数据目前已达到千万级别,需要进行分表分库,就需要对数据进行迁移,我们使用了otter,这里简单整理下,otter 的安装过程,希望对…...

一文学会Golang里拼接字符串的6种方式(性能对比)
g o l a n g golang golang的 s t r i n g string string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…...

【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖
之前自己第一次编译Python后发现pip会提示无法使用SSL,后来了解到是自己编译时没有配置OpenSSL。这个过程有点曲折,里面有一个坑,怕忘记于是写博客记录一下。 首先是下载OpenSSL,Python3.10.15支持此时最新版的OpenSSL 3.4.0&…...

Go语言获取客户端真实IP
在一些需求中,服务器需要记录客户端的ip地址,要获取ip地址,则需要有http.Request的对象参数传入,以下代码直接放在util中使用。 文件名:ip_utils.go package utilsimport ("context""github.com/spf1…...

大模型论文速递(11.23-11.25)
BlueLM-V3B 关键词:动态分辨率,图像放大,适应性网格化方法 研究问题:如何改进现有的动态分辨率匹配方法以减少在模型训练和部署中的计算复杂度? 方法: 分析现有动态分辨率匹配算法(如LLaVA-…...

维护在线重做日志(二)
迁移和重命名 可以使用操作系统命令重新定位重做日志,然后使用ALTER DATABASE语句使数据库知道它们的新名称(位置)。这个过程是必要的,例如,如果当前用于一些重做日志文件的磁盘将被删除,或者如果数据文件…...

.net core MVC入门(一)
文章目录 项目地址一、环境配置1.1 安装EF core需要包1.2 配置数据库连接二、使用EF创建表2.1 整体流程梳理2.1 建表详细流程三、添加第一个视图3.1整体流程梳理3.1 添加视图,并显示在web里四、使用EF增加Catogory数据,并且读取数据到页面4.1整体流程梳理4.2 实现五、增加Cat…...

802.11协议
802.11协议是由美国电气和电子工程师协会(IEEE)制定的无线局域网(WLAN)标准。以下是关于802.11协议的详细介绍: 一、定义与背景 定义:IEEE802.11是美国电机电子工程师协会(IEEE)为…...

【Linux】线程ID与互斥、同步(锁、条件变量)
作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年11月24日 线程ID及进程地址空间布局 先看一下这段代码: 运行一下: 运行这个代码之后,我们看到的这个很大的数字就是线程id,然后…...

Android 13 编译Android Studio版本的Launcher3
Android 13 Aosp源码 源码版本 Android Studio版本 Launcher3QuickStepLib (主要代码) Launcher3ResLib(主要资源) Launcher3IconLoaderLib(图片加载,冲突资源单独新建) 需要值得注意的是: SystemUISharedLib.jar 有kotlin和java下的,在 Lau…...

burp功能介绍
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...

Android12 的 Vold梳理
1.代码位置 system/vold/ 路径下,查看bp文件,发现是编译system/vold/main.cpp编译生成可执行文件vold 2.app侧调用代码流程 2.1 整体框架 #mermaid-svg-lqO8phN62rKNW407 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#…...

[pdf,epub]162页《分析模式》漫谈合集01-35提供下载
《分析模式》漫谈合集01-35的pdf、epub文件,已上传至本号的CSDN资源。 如果CSDN资源下载有问题,可到umlchina.com/url/ap.html。 已排版成适合手机阅读,pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》? ★[缝合故事…...

Vue2教程003:Vue指令之v-bind和v-for
文章目录 2.6 v-bind2.7 图片轮播案例2.8 v-for2.9 图书管理案例 2.6 v-bind 作用:动态设置html的标签属性->src、url、title…语法:v-bind:属性名"表达式" 动态设置img标签的src属性: <body> <div id"app&quo…...

Pathlib操作文件IN Python
系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、Pathlib是什么? 二、使用步骤 前言 pathlib 是 Python 标准库中用于操作文件和目录路径的模块,自 Python 3.4 起引入。它提供了一种面向对象的方式处理路径,使路径操作更加简洁、…...