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,一经查实,立即删除!

相关文章

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;…

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;除了这个数本身&…

Docker3:docker基础1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案

本文旨在深入探讨xinput1_3.dll这一动态链接库文件。首先介绍其在计算机系统中的功能和作用&#xff0c;特别是在游戏和输入设备交互方面的重要性。然后分析在使用过程中可能出现的诸如文件丢失、版本不兼容等问题&#xff0c;并提出相应的解决方案&#xff0c;包括重新安装相关…

Golang项目:实现一个内存缓存系统

要求 支持设定过期时间&#xff0c;精确到秒支持设定最大内存&#xff0c;当内存超过时做出合适的处理支持并发安全按照以下接口安全 type Cache interface{//size : 1KB 100KB 1MB 2MB 1GBSetMaxMemory(size string )bool//将value写入缓存Set(key string, val interface{},e…

计算机网络复习笔记(湖科大教书匠)

课程链接&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?p61&share_sourcecopy_web&vd_sourcecd12864239c2976e9f2bce4b307393f0 一、基础概念 信息交换方式 电路交换 电话交换机接通…

C语言菜鸟入门·关键字·int的用法

目录 1. int关键字 1.1 取值范围 1.2 符号类型 1.3 运算 1.3.1 加法运算() 1.3.2 减法运算(-) 1.3.3 乘法运算(*) 1.3.4 除法运算(/) 1.3.5 取余运算(%) 1.3.6 自增()与自减(--) 1.3.7 位运算 2. 更多关键字 1. int关键字 int 是一个关键字&#xff0…

神经网络(系统性学习三):多层感知机(MLP)

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络&#xff08;系统性学习一&#xff09;&#xff1a;入门篇 神经网络&#xff08;系统性学习二&#xff09;&#xff1a;单层神经网络&#xff08;感知机&#xff09; 多层感知机&#xff08;MLP&#xff09; 多层感…