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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

游戏引擎学习第99天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;制作一些光场(Light Field) 当前的目标是为游戏添加光照系统&#xff0c;并已完成了法线映射&#xff08;normal maps&#xff09;的管道&#xff0c;但还没有创建可以供这些正常映射采样的光场。为了继续推进&…

LSTM变种模型

GRU GRU简介 门控循环神经网络 (Gated Recurrent Neural Network&#xff0c;GRNN) 的提出&#xff0c;旨在更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可学习的门来控制信息的流动。其中&#xff0c;门控循环单元 (Gated Recurrent Unit &#xff0c; GRU) 是…

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…

新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验

宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件&#xff01;全新版本标志着 Panorama Suite的一个重要里程碑&#xff0c;代表了从 Panorama Suite 2022 开始并跨越三个版本&#xff08;2022、2023、2025&#xff09;的开发过程的顶峰。 此次重大发布集中在六个核心主…

PAT乙级真题 — 1080 MOOC期终成绩(java)【测试点3超时】

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;必须首先获得不少于200分的在线编程作业分&#xff0c;然后总评获得不少于60分&#xff08;满分100&#xff09;。总评成绩的计…

【Oracle篇】浅谈执行计划中的多表连接(含内连接、外连接、半连接、反连接、笛卡尔连接五种连接方式和嵌套、哈希、排序合并三种连接算法)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思&#xff1a;“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节&#xff1f;” 这种问题很适合我这种搞历史的人&#xff0c;大年初一我给出了一个简短的解释&#xff0c;但仔细探究这个问题&#xff0c;我们将会获得 TCP/IP 被定义的过程。 文…

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…

蓝桥杯(B组)-每日一题(求最大公约数最小公倍数)

题目&#xff1a; 代码展现&#xff1a; #include<iostream> using namespace std; int main() {int m,n,x,y;cin>>m>>n;//输入两个整数int b;bm%n;//取余数xm;//赋值yn;while(b)//当余数不为0的时候{xy;//辗转相除求最小公约数yb;bx%y;}cout<<y<&…

基于STM32的学习环境控制系统设计

&#x1f91e;&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是学习环境控制。 设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uWSZX2zbZwy9sY…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

4. React 中的 CSS

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

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大&#xff0c;CNN 和 Transformer 及 Uniformer 都难以胜任&#xff0c;Mamba 是个好思路&#xff0c;让我们看看本文是…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先&#xff0c;新建一个空的文件夹&#xff0c;然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架&#xff0c;可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序&#xff0c;比如 控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代…

PostgreSQL 开发利器:Navicat 核心功能与资源攻略

近几年&#xff0c;&#x1f418; PostgreSQL 在全球数据库排名中表现优异。在 2025 年 2 月 DB-Engines 排名中 (如图)&#xff0c;PostgreSQL 稳居第四名&#xff0c;并逐渐逼近第三名的 Microsoft SQL Server&#xff0c;其评分和受欢迎度持续增长&#xff0c;成为开源数据库…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…

修改docker内容器中的某配置文件的命令

先找到配置文件config.php find / -name "config.php" 2>/dev/null 然后用vi编辑器修改配置文件 vi /var/www/config.php 最后就是vi的基本操作&#xff0c;根据具体需求使用&#xff1a; vi 有两种主要模式&#xff1a; 命令模式&#xff1a;进入 vi 后的默认…