C++入门(3):引用,内联函数

一、引用

1.1 引用特性
  1. 引用必须初始化

在这里插入图片描述

  1. 一个变量可以有多个引用

  2. 引用一旦引用一个实体,就不能引用其他实体

int main()
{int a = 10, C = 20;int& b = a;b = c; // 赋值?还是b变成c的别名?return 0;
}

在这里插入图片描述

1.2 常引用

引用权限可以平移或缩小,但是不能放大

int main()
{// 情形1const int a = 10;// int& a1 = a; // errorconst int& a2 = a;// 情形2// int& b = 10; // errorconst int& b1 = 10;// 10具有常属性,权限平移// 情形3int c = 10;// double& c1 = c;// error,类型不同const double& c2 = c;// 隐式类型转换过程中,会创建一个具有常属性的临时变量return 0;
}
1.3 使用场景
  1. 做参数
#include <iostream>
using namespace std;void Swap(int& x, int& y)
{int tmp = x;x = y;y = x;
}int main()
{int a = 10;int b = 20;Swap(a, b);return 0;
}
  1. 做返回值

观察以下几个场景。

​ (a).

#include <iostream>
using namespace std;int count1()
{int n = 0;n++;return n;
}int& count2()// 实际上是个错误程序
{int n = 0;n++;return n;
}int& count3()
{static int n = 0;n++;return n;
}int main()
{int ret1 = count1();cout << ret1 << endl;int ret2 = count2();cout << ret2 << endl;int& ret3 = count2();// ret3是n的别名,count2函数栈帧销毁后,ret3/n 的值是不确定的cout << ret3 << endl;cout << ret3 << endl;int& ret4 = count3();cout << ret4 << endl;return 0;
}

​ (b).

#include <iostream>
using namespace std;// static
int& Add1(int a, int b)
{static int c = a + b;return c;
}int& Add2(int a, int b)
{static int c;c = a + b;return c;
}int main()
{int& ret1 = Add1(1, 2);cout << "Add1(1, 2) = " << ret1 << endl;Add1(3, 4);cout << "Add1(1, 2) = " << ret1 << endl << endl;int& ret2 = Add2(1, 2);cout << "Add2(1, 2) = " << ret2 << endl;Add2(3, 4);cout << "Add2(1, 2) = " << ret2 << endl << endl;return 0;
}

在这里插入图片描述

1.4 传值、传引用效率比较

以值作为参数或返回值类型,在传参和返回期间,函数不会传递实参或将变量本身直接返回,而是传递实参或返回变量的一份临时拷贝。因此用值作为参数或返回值类型,效率非常低下。

1.5 引用和指针的区别

语法概念上,引用是被引用实体变量的别名,并没有开辟新的内存空间。

在这里插入图片描述

底层实现上,实际开了空间。引用是按照指针的方式实现的。

在这里插入图片描述

二、内联函数

2.1 概念

内联函数是用关键词 inline 修饰的函数,可以代替宏函数(宏函数缺点:1. 语法细节多,易出错;2. 不可调试;3. 没有类型安全检查)。

编译时,C++编译器会在把内联函数在调用位置展开,没有建立函数栈帧的开销,在一定程度上提高程序运行效率。

(在debug模式下,编译器默认不会对代码进行优化,需要通过设置以观察到内联函数)

  1. 右击项目,进入 属性

在这里插入图片描述


在这里插入图片描述

2.2 特性
  1. inline 是一种以空间换时间的做法,在编译阶段,会用函数体替换函数调用。
  2. inline 对编译器来说只是一个“请求”,编译器可以选择忽略。一般建议:将函数规模较小不是递归频繁调用的函数用 inline 修饰,否则编译器会忽略 inline 特性。
  3. inline 不能声明和定义分离,分离会导致链接错误——inline 被展开就没有函数地址了。
// Func.h
#include <iostream>
using namespace std;inline void f(int x);// Func.cpp
#include "Func.h"void f(int x)
{cout << "f(x)" << endl;
}// test.cpp
#include "Func.h"int main()
{f(10);return 0;
}// error:
// 链接错误:Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z),函数 _main 中引用了该符号

正确做法:

// Func.h
#include <iostream>
using namespace std;inline void f(int x)
{cout << "f(x)" << endl;
}

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

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

相关文章

ubuntu双系统安装以及启动时卡死解决办法

目录 一.简介 二.安装 如何安装Ubuntu20.04(详细图文教程-CSDN博客 Ubuntu22.04&#xff08;非虚拟机&#xff09;安装教程&#xff08;2023最新最详细&#xff09;-CSDN博客 三.ubuntu双系统启动时卡死解决办法&#xff08;在ubuntu16.04和18.04测试无误&#xff09; 问题…

vue实现响应式改变scss样式

需求&#xff1a;侧边导航栏点击收起&#xff0c;再次点击展开&#xff0c;但是我这个项目的位置是在左侧菜单栏所以需要自定义 效果图&#xff1a; 实现步骤&#xff1a; 1&#xff1a;定义一个变量&#xff08;因为我这里会存储菜单栏的状态所以需要存储状态&#xff0c;一…

09、Python 字典入门 及 高级用法

目录 字典创建字典通过key访问value添加key-value对删除key-value对替换key-value对 判断是否包含指定keydict与列表字典的常用方法演示&#xff1a; 用字典格式化字符串 创建字典 操作字典key-value对 理解dict与list的关系 字典常用方法 使用字典格式化字符串 字典 字典用于…

2023/10/23 mysql学习

数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…

分享一下商城小程序怎么设置分销功能

随着互联网的快速发展&#xff0c;传统的营销方式已经无法满足企业的需求。在这个时代&#xff0c;拥有一个高效的分销系统已经成为了企业成功的关键之一。而商城小程序作为近年来火爆的电商新模式&#xff0c;其中的分销功能更是备受关注。本文将以分销功能为主要主题&#xf…

Rockchip RK3399 - DRM crtc基础知识

一、LCD硬件原理 1.1 CRT介绍 CRT是阴极射线管(Cathode Ray Tube)的缩写&#xff0c;它是一种使用电子束在荧光屏上创建图像的显示设备。CRT显示器在过去很长一段时间内是主流的显示技术&#xff0c;现已被液晶显示屏或其他新兴技术所替代。 在CRT显示器中&#xff0c;扫描电子…

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代&#xff0c;小程序已经成为企业营销的重要工具。通过小程序&#xff0c;企业可以提供更加便捷、高效的服务&#xff0c;吸引更多的用户和客户。本文将以小程序营销活动为主题&#xff0c;介绍如何在小程序文章中加入营销活动&#xff0c;提高品牌知名度和销售额。…

C/C++数据结构——队列

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、队列的基本操作&#xff08;循环队&#xff09; 1、循环队的数据类型 2、循环队的名词解释 3、循环队的创建及…

Windows与Linux服务器互传文件

使用winscp实现图形化拖动的方式互传文件. 1.下载winscp软件并安装&#xff0c;官方地址&#xff1a; https://winscp.net/eng/index.php 2.打开软件&#xff1a; 文件协议选择scp&#xff0c;输入linux服务器的IP和端口号&#xff0c;然后输入你的用户名和密码就可以登陆了。…

基于Java的校园餐厅订餐管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Linux 进程切换与命令行参数

假设进程1现在要切走了&#xff0c;切入进程2.那进程1就要先保存数据&#xff0c;方便以后恢复&#xff0c; 然后进程2再切走&#xff0c;进程1再把数据还原&#xff1a; 操作系统又分为实时操作系统和分时操作系统。 实时操作系统是是给操作系统一个进程&#xff0c;操作系统…

【漏洞复现】panalog日志审计系统任意用户创建漏洞和后台命令执行

漏洞描述 panalog为北京派网软件有限公司,一款流量分析,日志分析管理的一款软件。存在任意用户创建漏洞和后台命令执行漏洞,可先通过任意用户创建,然后进行后台命令执行,获取服务器权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公…

Vue单文件组件

一、.vue文件 我们使用Vue的单文件组件的时候&#xff0c;一个.vue文件就是一个组件。 例如我们创建一个School组件&#xff1a; 二、组件的结构 我们编写网页代码的时候有HTML结构、CSS样式、JS交互。 组件里也是同样存在这三种结构的&#xff1a; <template><d…

甘特图组件DHTMLX Gantt示例 - 如何有效管理团队工作时间?(二)

如果没有有效的时间管理工具&#xff0c;如工作时间日历&#xff0c;很难想象一个项目如何成功运转。这就是为什么我们的开发团队非常重视项目管理&#xff0c;并提供了多种选择来安排DHTMLX Gantt的工作时间。使用DHTMLX Gantt这个JavaScript库&#xff0c;您可以创建一个强大…

2024SCI经验心得分享---如何在零基础、导师基本放养的情况下---发表自己的第一篇SCI(三区)经验分享篇

本期的经验分享&#xff0c;采访到了我的一位非常非常非常优秀的师妹&#xff0c;师妹于今年6月份投稿&#xff0c;10月份录用&#xff0c;历时四个月录用了自己的第一篇SCI&#xff08;三区&#xff09;的文章图像处理类的&#xff0c;同时师妹也取得了很多其他优秀的荣誉。 众…

软考系列(系统架构师)- 2020年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对该系统的功能&#xff0c;李工建议采用管道-过滤器&#xff08;pipe and filter)的架构风格&#xff0c;而王工则建议采用仓库&#xff08;reposilory)架构风格。请指出…

mysql图片存取初探

mysql数据库中使用blob存储使用base64加密图片数据 前言 这个方法并不好&#xff0c;因为传输的数据量还是蛮大的&#xff0c;可以存一些诸如头像的小图片&#xff0c;但是如果要存较大的图片会很慢。 不过只是课程作业中简单的功能&#xff0c;这样子简单又快捷&#xff0c;…

CICD 流程学习(五)Jenkins后端工程构建

案例1&#xff1a;数据库服务部署 MySQL部署 #安装MySQL服务 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 ... Complete! [rootServices ~]# #启动…

【JavaEE】网络编程---TCP数据报套接字编程

一、TCP数据报套接字编程 1.1 ServerSocket API ServerSocket 是创建TCP服务端Socket的API ServerSocket 构造方法&#xff1a; ServerSocket 方法&#xff1a; 1.2 Socket API Socket 是客户端Socket&#xff0c;或服务端中接收到客户端建立连接&#xff08;accept方法&…

WordPress SMTP邮件发送插件 Easy WP SMTP

Easy WP SMTP是一款 WordPress 邮件发送插件&#xff0c;WordPress 中经常用到邮件发送&#xff0c;包括新注册用户的邮件通知、找回密码通知、评论回复通知等。因为云服务器默认不启用 SMTP功能&#xff0c;所以需要安装 SMTP插件来解决这个问题。 SMTP 主机&#xff1a;smtp.…