当前位置: 首页 > news >正文

C++ ——基础进阶

1、引用

        概念:相当于给变量取个别名,通过使用&在变量定义时定义

1.1 性质

(1)成为一个变量的引用后,就不能成为其他变量的引用

    int a=1;
    int& a_cite=a;
    int b=90;
    a_cite=b;  //相当于把b的值给了a_cite
    cout<<a_cite<<endl;  //90
    cout<<a<<endl;  //90
    cout<<b<<endl;  //90
    a++;
    cout<<a_cite<<endl;  //91
    cout<<a<<endl;  //91
    cout<<b<<endl;  //90
//    int&a_cite=b;  //错误

(2)引用必须初始化,并且不可以为NULL

    int c=0;
//    int&c_cite;  //错误,引用必须初始化
//    int&c_cite=NULL;  //错误,不能初始化为NULL

(3)引用可以是纯数字的引用,当作为纯数字的引用时,需要加const修饰,代表其引用的数值不可修改

    const int&cite=55;
    cout<<cite<<endl;
//    cite++;  //报错,纯数字的引用不能修改

(4)变量的引用如果使用const修饰,此时该引用叫常引用,表示不能通过引用修改变量的值,但可以通过原变量修改变量的值

    int d=1;
    const int&d_cite=d;  //常引用
//    d_cite=90;  //错误,常引用不能修改变量的值
    d=100;
    cout<<d_cite<<endl;  //100
    cout<<d<<endl;  //100

(5)可以给指针变量建立引用,相当于给指针变量取了别名,该引用指向原变量

    int f=7;
    int*p=&f;
    int*&p_cite=p;  //整型指针引用
    cout<<p<<endl;  //0000003D2D13F67C
    cout<<*p<<endl;  //7
    cout<<p_cite<<endl;  //0000003D2D13F67C
    cout<<*p_cite<<endl;  //7
    *p_cite=1;
    cout<<f<<endl;  //1
    cout<<*p<<endl;  //1
    cout<<*p_cite<<endl;  //1

(6)可以是指针指向引用的地址,相当于指向了变量的地址

    int e=90;
    int&e_cite=e;
//    int*ptr=&e;  //方法一
    int*ptr=&e_cite;  //方法二
    cout<<*ptr<<endl;  //90
    *ptr=100;
    cout<<e<<endl;  //100
    cout<<e_cite<<endl;  //100

1.2 函数参数的传递

C++中函数参数的传递有三种:

        (1)值传递:只是实参的拷贝,形参改变不会影响到实参

#include <iostream>  //iostream:输入输出流文件 ,相当于stdint.h
using namespace std;  //命名空间
void add_number1(int number);
int main()  //入口函数
{
    int number=1;
    add_number1(number);
    cout<<number<<endl;  //1
    return 0;
}
void add_number1(int number){
    number++;
    cout<<number<<endl;  //2
}

        (2)引用传递:不会产生拷贝副本,相当于操控变量本身,形参改变会影响到实参

#include <iostream>  //iostream:输入输出流文件 ,相当于stdint.h
using namespace std;  //命名空间
void add_number2(int& number);
int main()  //入口函数
{
    //引用传递:是把变量的引用传递函数,函数内部对参数的改变,函数外部的变量也会受到影响
    int number=1;
    add_number2(number);
    cout<<number<<endl;  //2
    return 0;
}
void add_number2(int& number){
    number++;
    cout<<number<<endl;  //2
}

        (3)指针传递:是把变量的地址传递给函数,函数内部对变量的修改也会影响带函数外部原来的变量

 建议:

        (1)如果函数体内对参数的改变,在函数体外需要受到影响,推荐选择引用传递,不推荐指针传递

#include <iostream>  //iostream:输入输出流文件 ,相当于stdint.h
using namespace std;  //命名空间
void change_number1(int&c1,int&c2);
int main()  //入口函数
{
    int num1=7,num2=9;
    change_number1(num1,num2);
    cout<<"num1="<<num1<<",num2="<<num2<<endl;  //num1=9,num2=7
    return 0;
}
void change_number1(int&c1,int&c2){
    int num=0;
    num=c1;
    c1=c2;
    c2=num;
}

        (2)如果函数体内对参数的改变,在函数体外不需要受到影响,推荐使用引用传递,加const修饰

#include <iostream>  //iostream:输入输出流文件 ,相当于stdint.h
using namespace std;  //命名空间
void change_number2(const int& num);
int main()  //入口函数
{
    int num1=7,num2=9;
    change_number2(num1);
    cout<<num1<<endl;  //9
    return 0;
}
void change_number2(const int& num){
    cout<<num*100<<endl;  //900

2、内联函数inline 

定义:使用inline关键字修饰的函数,取代了C中宏函数

对比:普通函数需要经历函数调用,函数调用比较消耗性能;内联函数与宏函数相同,是在预处理阶段,进行函数体的展开,不需要经历函数调用

总结:内联函数是一个空间换时间的方法,缺点:会增大可执行文件的体积;优点:不需要经历函数调用的过程,提高了效率

内联函数的使用条件:

        (1)函数体逻辑代码不能太复杂,不能包含for、while、switch等符合语句

        (2)函数代码少于5行

        (3)函数调用频繁

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
inline void func();
int main(){
    func();
    return 0;
}
inline void func(){
    cout<<"gbsrhwrw"<<endl;
}

3、函数参数的默认值 

C++中允许给函数参数添加默认值,调用函数时,如果不传递参数则使用默认值;如果传递参数则覆盖默认值。默认值可以提高程序的灵活性

注意事项:

        (1)函数定义和声明分离时,推荐函数参数的默认值设置在声明处

        (2)函数声明和定义不分离,函数参数的默认值设置在定义处

        (3)当函数有多个参数时,函数参数的默认值遵循“向右(向后)原则”,即一个参数有默认值,其后的参数都要有默认值

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
void fn1(int a,int b=1);
int main(){
    fn1(100,200);  //300
    fn1(100);  //101
    return 0;
}
void fn1(int a,int b){
    cout<<"a+b="<<a+b<<endl;
}

4、函数的重载

 C++中允许定义同名函数来处理相同的业务逻辑

注意:

        (1)重载函数调用时,可以根据参数的类型不同、参数的个数不同进行区分,不能通过返回值类型不同进行区分

        (2)函数重载不要和函数默认值一起使用,容易产生错误

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
void show();
void show(int a);
void show(string str);
void show(int a,int b);
int main(){
    show();
    show(89);
    show("hello");
    show(12,34);
    return 0;
}
void show(){
    cout << "哈哈哈" << endl;
}
void show(int a){
    cout << a << endl;
}
void show(string str){
    cout << str << endl;
}
void show(int a,int b){
    cout << a+b << endl;
}

相关文章:

C++ ——基础进阶

1、引用 概念&#xff1a;相当于给变量取个别名&#xff0c;通过使用&在变量定义时定义 1.1 性质 &#xff08;1&#xff09;成为一个变量的引用后&#xff0c;就不能成为其他变量的引用 int a1; int& a_citea; int b90; a_citeb; //相当于把b的值给了a_cite cout&l…...

@synchronized的使用

synchronized 介绍 synchronized 是 Objective-C 提供的一种 互斥锁&#xff08;Mutex&#xff09;&#xff0c;它用于确保一段代码在同一时间只有一个线程能执行&#xff0c;避免多线程访问共享资源时出现数据竞争。 基本语法 synchronized (lockObject) {// 需要加锁的代码…...

策略模式-小结

总结一下看到的策略模式&#xff1a; A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3&#xff0c;实现上面的接口。 C:一个环境类&#xff08;或者上下文类&#xff09;&#xff0c;形式可以是&#xff1a;工厂模式&#xff0c;构造器注入模式&#xff0c;枚举模式。 …...

【Stable Diffusion部署至Google Colab】

Google Colab 中快速搭建带 GPU 加速的 Stable Diffusion WebUI from google.colab import drive drive.mount(/content/drive) !mkdir /content/drive/MyDrive/sd-webui-files !pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index…...

Vue.js 与低代码开发:如何实现快速应用构建

在当今数字化高速发展的时代&#xff0c;企业对应用开发的速度和效率有着迫切的需求。传统开发模式往往周期长、成本高&#xff0c;难以满足市场的快速变化。而低代码开发的兴起&#xff0c;为这一困境带来了转机。Vue.js 作为一款流行的 JavaScript 前端框架&#xff0c;以其简…...

【无标题】《On Java中文版基础卷+进阶卷》书评

Java语言作为最热门的编程语言之一&#xff0c;关于Java语言的书更是数不胜数&#xff0c;而我选择这本《On Java中文版基础卷进阶卷》作为我学习Java语言的工具书。这本书的作者是《Java编程思想》的Bruce Eckel&#xff0c;《Java编程思想》在之前可谓是鼎鼎有名&#xff0c;…...

Spring Boot从入门到精通:核心知识点+实战指南

目录 一、Spring Boot 是什么&#xff1f;为什么它如此流行&#xff1f; 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...

网络安全 | 网络安全自动化:让防护更智能高效

网络安全 | 网络安全自动化&#xff1a;让防护更智能高效 一、前言二、网络安全自动化的核心概念2.1 定义与内涵2.2 与传统网络安全方法的区别 三、网络安全自动化的应用领域3.1 威胁检测与响应3.2 漏洞管理3.3 访问控制与身份认证 四、推动网络安全自动化发展的因素4.1 技术进…...

时间敏感和非时间敏感流量的性能保证配置

论文标题 中文标题&#xff1a; 时间敏感和非时间敏感流量的性能保证配置 英文标题&#xff1a; Provisioning of Time-Sensitive and non-Time-Sensitive Flows with Assured Performance 作者信息 Luis Velasco, Gianluca Graziadei, Sima Barzegar, Marc Ruiz Optical Co…...

502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决

502 Bad Gateway 错误通常意味着服务器之间的通信失败&#xff0c;但导致的具体原因往往因场景而异。 场景一&#xff1a;高峰期频繁出现 502 错误 1.1 现象 在流量高峰期间&#xff08;如促销活动、直播发布等&#xff09;&#xff0c;页面访问变慢甚至出现 502 错误&#…...

如何获取,CPU,GPU,硬盘,网卡,内存等硬件性能监控与各项温度传感器

首先需要下载 OpenHardwareMonitorServer 这是一个基于OpenHardwareMonitor 的 Web 服务器。可以让任何语言都可以获取硬件信息和值&#xff0c;OpenHardwareMonitorServer 是没有UI界面的因此它可以当成控制台程序使用。 该程序可用参数如下 参数&#xff1a;需要管理员权限…...

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…...

【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析  4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2019-17621 漏洞名称&#xff1a;D-Link DIR-859 命令注入漏洞 威胁等级&#xff1a;严重 漏洞详…...

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…...

fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系

Transformer、Seq2Seq、Encoder-Decoder、Attention由这四者之间的关系可以从模型架构的发展脉络来理解&#xff1a; Seq2Seq 与 Encoder–Decoder 模型 “Seq2Seq”&#xff08;sequence‐to‐sequence&#xff09;是一类用于将一个变长序列映射为另一个变长序列的任务&#x…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

图书管理项目(spring boot + Vue)

想要该项目的话&#xff0c;就 jia 我&#xff0c;并在评论区给我说一下&#xff0c;只需要1元&#xff0c;我把整个项目发给你 jia微&#xff1a;18439421203&#xff08;名字叫&#xff1a;Bingo&#xff09; 运行图片&#xff1a;...

python实现常见数学概率分布

常见正态分布 1.贝塔分布1.1 概率密度函数1.2参数对分布形状的影响1.3 应用场景1.4 python实现 2. 帕累托分布&#xff08;80/20法则&#xff09;3. 正态分布&#xff08;高斯分布&#xff09;3.1 正态分布对应性质3.2 正态分布对应图像![在这里插入图片描述](https://i-blog.c…...

解决Blender无法识别Num关闭状态下的笔记本数字键盘中Home键、End键问题

问题描述&#xff1a; 在笔记本电脑上&#xff0c;多少会缺少一些按钮&#xff0c;例如“Home”、“End”、“PgUp”、“PgDn”&#xff0c;它们在笔记本电脑上的作用是&#xff0c;如果关闭Num&#xff0c;则可以从数字键盘访问这些按钮。但问题是在Blender中&#xff0c;不论…...

React 高级教程

使用 React 高级组件&#xff08;HOC&#xff09;实现的完整项目示例&#xff0c;包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构&#xff1a; src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- He…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...