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++程序通常使用NULL0来表示空指针。然而,这两种方法都有其缺点:

  • 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可以传递给成员函数的指针参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32内部高速晶振打开作为主时钟

首先建议你别这么干&#xff0c;因为内部晶振特别容易受温度等外界影响&#xff0c;很容易卡死或堵死程序 我是因为没画外部晶振电路&#xff0c;所以只能开内部晶振来作为时钟 适用于stm32f103系列 把下面的代码换掉源文件里的时钟源配置 /* 开启HSI 即内部晶振时钟 */RCC…

Nginx防御机制

文章目录 1.访问控制1.1基于 IP 的访问限制1.2基于用户认证的访问控制 2.防止 DDoS 攻击2.1连接数限制2.2请求速率限制 3.缓存机制3.1内容缓存 4.安全协议与加密4.1SSL/TLS 加密4.2HTTP/2 支持 5.防 SQL 注入和 XSS 攻击5.1输入验证与过滤 6.防盗链6.1基于 Nginx 的防盗链配置方…

lua除法bug

故事背景&#xff0c;新来了一个数值&#xff0c;要改公式。神奇的一幕出现了&#xff0c;公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交&#xff0c;拉取远程代码修改提交本地&#xff0c;远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区&#xff1a;本地电脑上看到的目录&#xff1b; repository 本地仓库&#xff1a;就是工作区中隐…

嵌入式系统应用-LVGL的应用-智能时钟 part 3

智能时钟 part 3 6 光强传感器6.1 光敏电阻介绍6.2 电路图介绍 7 ADC模块7.1 ADC模块介绍7.2 adc 转化流程7.3 规则通道和注入通道7.4 DMA 搬运7.5 TIM触发ADC和DMA搬运数据的原理 8 代码8.1 配置头文件8.2 初始化ADC 和DMA8.3 创建线程读取 值8.4 演示效果 由于丢失温湿度传感…

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

架构-微服务-服务治理

文章目录 前言一、服务治理介绍1. 什么是服务治理2. 常见的注册中心 二、nacos简介三、nacos实战入门1. 搭建nacos环境2. 将商品微服务注册到nacos3. 将订单微服务注册到nacos 四、实现服务调用的负载均衡1. 什么是负载均衡2. 自定义实现负载均衡3. 基于Ribbon实现负载均衡 五、…

AWS的流日志

文章目录 一、aws如何观察vpc的日志&#xff1f;二、aws观测其vpc的入口日志三、 具体配置3.1、配置你的存储神器 S33.2、建立子网的流日志 一、aws如何观察vpc的日志&#xff1f; 排查问题的时候除了去抓包看具体的端口信息的时候&#xff0c;还可以根据其所在的vpc的子网信息…

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统

万物皆可Docker&#xff0c;在NAS上一键部署最新苹果MacOS 15系统 哈喽小伙伴们还&#xff0c;我是Stark-C~ 最近苹果Mac mini 2024款在政府补贴的加持下&#xff0c;仅需3500块钱左右就能到手确实挺香的。我看很多评论区的小伙伴跃跃欲试&#xff0c;但是也有不少之前从未体…

函数模板(进阶)

机甲为婚纱&#xff0c;银河为殿堂&#xff0c;爆炸为礼炮&#xff0c;见证了只属于他们的婚礼&#xff0c;樱花树下&#xff0c;再续前缘&#xff0c;鹤望兰无凋零之时&#xff0c;比翼鸟永世长存。 我们这一篇博客紧接我们前面的函数模板&#xff08;初阶&#xff09;这一篇博…

全面解析:HTML页面的加载全过程(五)--浏览器渲染之布局Layout

理解一些概念&#xff1a; 盒子模型 页面中的所有元素都被看作一个矩形盒子 内边距&#xff08;padding)是内容区周围的空间。 边框(border)会在内边距外侧增加一条框线&#xff0c;这条框线可以是实线、虚线或点划线。 外边距(margin)&#xff0c;外边距是围绕在盒子可见…

AI 驱动的个性化推荐系统设计

文章目录 摘要引言推荐系统的核心原理推荐系统的类型个性化推荐中的挑战 基于协同过滤的推荐系统设计设计流程系统架构设计 示例代码模块1&#xff1a;数据准备模块2&#xff1a;相似度计算模块3&#xff1a;推荐生成模块4&#xff1a;整体调用与展示 QA 环节总结参考资料 摘要…

基于springboot + vue-element-plus-admin开发的MES系统源码,制造执法系统MES源码;支持app,小程序,H5,后台

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的生产计划管理功能是其核心功能之一&#xff0c;旨在将企业的生产计划转化为实际的生产操作&#xff0c;并通过实时监控和调整来确保生产活动的顺利进行。 MES系统技术栈&#xff1a;…

力扣第 63 题不同路径 II

题目描述 一个机器人位于一个 m n m \times n mn 网格的左上角&#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或向右移动一步。机器人试图到达网格的右下角&#xff08;标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。网格中的…

Java后端如何进行文件上传和下载 —— 本地版

简介&#xff1a; 本文详细介绍了在Java后端进行文件上传和下载的实现方法&#xff0c;包括文件上传保存到本地的完整流程、文件下载的代码实现&#xff0c;以及如何处理文件预览、下载大小限制和运行失败的问题&#xff0c;并提供了完整的代码示例。 大体思路 1、文件上传 …

深入理解结构化学习:从结构化感知器到条件随机场

摘要 结构化学习是一类能够处理复杂输出空间问题的机器学习方法&#xff0c;被广泛应用于自然语言处理、图像分析等领域。本文将从三个经典模型——结构化感知器、隐马尔可夫模型 (HMM) 和条件随机场 (CRF) 入手&#xff0c;详细解析其理论基础、算法实现及应用案例&#xff0c…

C#基础题总结

16.一张单据上有一个5位数的号码为6**42&#xff0c;其中百位数和千位数已模糊不清&#xff0c;但知道该数能被 57 和 67 除尽。设计一个算法&#xff0c;找出该单据所有可能的号码。 17.编程序求2&#xff5e;10000以内的完全数。一个数的因子&#xff08;除了这个数本身&…

IP Transit國外頻寬使用最高優先權,國內直接與骨幹互連

鼎峰新匯IP Transit服務具國外頻寬使用最高優先權&#xff0c;國內直接與骨幹互連&#xff0c;提供多路連外路由&#xff0c;連線穩定度極高。 鼎峰新匯與國內外各大ISP業者合作&#xff0c;提供最優質的網路品質。 節省成本&#xff1a;用戶不需自行與各ISP申請網路連結&…

24.10.15学习记录

TIME-TFT模型 Temporal Fusion Transformers (TFT) 是一种先进的深度学习模型&#xff0c;专门设计用于时间序列预测任务。它结合了多种机制来处理时间序列数据中的复杂关系&#xff0c;包括静态协变量和时变变量的输入&#xff0c;以及对时间动态的可解释性理解。 TFT 模型的核…

【CVE-2024-48694】OfficeWeb365 SaveDraw

漏洞描述 OfficeWeb365 v.8.6.1.0和v7.18.23.0中的文件上传漏洞允许远程攻击者通过pw/savedraw组件执行任意代码。 影响版本&#xff1a; V8.6.1.0&#xff1b; V7.18.23.0 网络测绘 “OfficeWeb365” 漏洞信息 POST /PW/SaveDraw?path../../Content/img&idx6.ashx H…