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-…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...