【C++小语法】引用和内联函数(完结篇)

在使用C语言编程过程中,C语言的要求之严格,编程过程之繁琐,大同小异的重复性工作,令C++之父使用C语言编程时也深受其扰,于是乎C++兼容C小语法诞生了

一、引用

1.引用概念

在C++中,引用(Reference)是一种特殊的别名,它是为已存在的变量起一个别名。(底层是按指针实现的)

一般形式:类型& 引用变量名(对象名) = 引用实体

*2.引用特性(引用和指针区别)

特性:

(1)引用必须初始化,即引用必须引用一个已存在的对象。(指针不是必须初始化)

(2)一个变量可以有多个引用

(3)引用一旦引用了一个实体,不可以再引用别的(指针可以指向不同的实体)

(4)引用没有自己的内存空间,它只是对象的一个别名,对引用的操作等同于对对象本身的操作。(指针有自己的内存空间,是对指向对象的间接操作)

此外引用与指针的区别还有:

1)没有NULL引用,但有NULL指针
2) 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
3)引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

4)有多级指针,但是没有多级引用
5)访问实体方式不同,指针需要显式解引用,引用编译器自己处理
6)引用比指针使用起来相对更安全
 

3.常引用

const 修饰 (权限的平移或缩小)

一般形式:const 类型& 引用变量名(对象名) = 引用实体

4.使用场景

(1)做参数

(2)做返回值

代码示例:

#include <iostream>
using namespace std;

void my_swap(int a, int b)
{
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}
//引用做参数
void my_swap1(int &a, int &b)
{
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}
//引用做返回值
int &Add(int a, int b)
{
	//此时c为静态变量,延长了生命周期,出了Add函数后c未被销毁
	static int c = a + b;
	return c;
}
int main()
{
	int x = 10;
	int y = 20;

	//z是x的别名,z必须初始化
	int& z = x;
	//相当于x++
	z++;
	cout << "z=" << z << endl;
	cout << "x=" << x << endl;
	cout << endl;

	//错误const修饰,相当于权限缩小,y可读可写,A只可读
	const int& A = y;
	//A++;//不可以通过对A的操作来改变y
	y++;//不可以通过对y的操作来改变y和A
	cout << "y=" << z << endl;
	cout << "A=" << x << endl;
	cout << endl;

	const int m = 30;
	//m只可读 ,B可读可写
	//int& B = m;//错误 const int转换为int,权限的放大
	
	//m只可读 ,C只可读
	const int& C = m;//错误 权限的平移
	
	//将m拷贝给P,赋值
	int P = m;
	cout << "P=" << P << endl;
	cout << endl;

	//引用做参数
	int a = 1;
	int b = 2;
	my_swap(a, b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << endl;
	my_swap1(a, b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << endl;

	//引用做返回值
	cout << "Add(1, 2)=" << Add(1, 2) << endl;
	
	return 0;
}

运行结果:

二、内联函数

1.内联概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率


2.特性

(1)inline对编译器只是建议,具体展开与否要看编译器。一般建议将:函数规模较小(具体取决于编译器判断),频繁调用不是递归函数的函数采用inline修饰,否则编译器会忽视内联特性。

(2)inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大优势:少了调用开销,提高程序运行效率

(3)inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。


代码示例:

#include<iostream>
using namespace std;

//定义一个内联函数
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

int main() {
    int x = 10;
    int y = 20;
    // 调用inline函数
    int result = max(x, y);
    cout << "The maximum value is: " << result << endl;
    return 0;
}


代码示例二:

//Inline.h
#include <iostream>
using namespace std;
//内联函数声明
inline int max(int a, int b);

//Inline.cpp
 #include "Inline.h"
// 函数定义
int max(int a, int b) {
    return (a > b) ? a : b;
}

//Main.cpp
#include "Inline.h"
int main() {
    int x = 10;
    int y = 20;
    // 调用inline函数
    int result = max(x, y);
    cout << "The maximum value is: " << result << endl;
    return 0;
}
//错误	LNK2019	无法解析的外部符号 "int __cdecl max(int,int)" (? max@@YAHHH@Z),函数 main 中引用了该符号	Project17	D : \code\cyuyan\test\Project17\Main.obj	1

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

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

相关文章

SpringCloud------Feign,Geteway

Feign 所以我们使用一门新的技术&#xff1a;声明式的http客户端Feign 第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> …

C++ | Leetcode C++题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> t;vector<vector<int>> ans;vector<vector<int>> subsetsWithDup(vector<int> &nums) {sort(nums.begin(), nums.end());int n nums.size();for (int mask …

C++青少年简明教程:赋值语句

C青少年简明教程&#xff1a;赋值语句 赋值语句是编程中最基本也是最常用的概念之一&#xff0c;它用于将一个值分配给一个变量。 使用等号&#xff08; 称为赋值运算符&#xff09;来给变量赋值&#xff0c;赋值语句的左边是要赋值的变量&#xff0c;右边是要赋给变量的值。C…

PHP 自提时间

前端: 后台设置: 代码: public function getBusinessHour(){// 需求单门店$data (new StoreModel())->limit(1)->select()->toArray();$days explode(,, $data[0][shop_hours]);$businessHours $days[1];// 使用 explode 分割字符串&#xff0c;获取开始和结束时…

Nodejs 第七十章(OSS)

OSS OSS&#xff08;Object Storage Service&#xff09;是一种云存储服务&#xff0c;提供了一种高度可扩展的、安全可靠的对象存储解决方案 OSS 对象存储以对象为基本存储单元&#xff0c;每个对象都有唯一的标识符&#xff08;称为对象键&#xff09;和数据。这些对象可以…

【教程】Jetson安装PyQt5和CUDA版OpenCV

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装PyQt5 注意目前似乎只支持Python3.6&#xff01;&#xff01;&#xff01; sudo apt install pyqt5* -y sudo apt-get install python3-pyqt…

基于HTTP GET方式获取网络时间的实现

上一节&#xff0c;我们介绍了基于NTP服务器获取网络时间的例子&#xff0c;但在有些情况下&#xff0c;比如我最近在使用RNDIS协议通过4G模块上网&#xff0c;这个协议不支持UDP协议&#xff0c;所以就用不了NTP服务器。或者有时候我们需要有更多的网络时间获取方式&#xff0…

python数据分析——seaborn绘图2

参考资料&#xff1a;活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns tipspd.read_csv(r"...\seaborn常用数据案例\tips.csv") print(tips.head()) 1、成对关系表示 当数据大部分是数据时&#xff0c;可以使用…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件&#xff08;提取人物姿态&#xff09; 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

数据库学习之select语句练习

目录 素材 练习 1、显示所有职工的基本信息。 结果 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 结果 3、求出所有职工的人数。 结果 4、列出最高工和最低工资。 结果 5、列出职工的平均工资和总工资。 结果 6、创建一个只有职…

【全开源】房屋出租出售预约系统支持微信小程序+H5+APP

一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 特色功能&#…

Salesforce AI研究: 从奖励建模到在线RLHF工作流

摘要 该研究在本技术报告中介绍了在线迭代基于人类反馈的强化学习(Online Iterative Reinforcement Learning from Human Feedback, RLHF)的工作流程,在最近的大语言模型(Large Language Model, LLM)文献中,这被广泛报道为大幅优于其离线对应方法。然而,现有的开源RLHF项目仍然…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 &#xff08;1&#xff09;爬虫文件创建&#xff08;2&#xff09;检查网址是否正确&#xff08;3&#xff09;检查反爬&#xff08;3.1&#xff09; 简写输出语句&#xff0c;检查是否反爬&#xff08;3.2&#x…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发&#xff0c;需要从这种程序的开发语言开始&#xff0c;比如说Android开发从入门到放弃&#xff0c;肯定是从Java基础或者是Kotlin语言基础开始学习的&#xff0c;IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外&#xff0c;如果做…

二叉树的前序遍历(leetcode)

144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 这道题的启发性真的很强 &#xff0c;这里必须传入i的指针进去&#xff0c;下一次栈帧i&#xff0c;但回到了上一层i又变回到了原来的i&#…

办公园区建筑科技风效果(html+threejs)

办公楼科技风(Htmlthreejs) 初始化三维场景 function init() {container document.getElementById(container);camera new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 150000000);camera.position.set(550, 600, 690);scene new THREE.Sce…

短视频的拍摄方式有哪些:四川京之华锦信息技术公司

创意与技术并存的艺术之旅 在数字媒体高速发展的今天&#xff0c;短视频已经成为人们获取信息、表达情感、展示才艺的重要窗口。从社交平台到新闻资讯&#xff0c;再到教育娱乐&#xff0c;短视频无处不在&#xff0c;其独特的魅力和广泛的传播力让人们对它的拍摄方式产生了浓…

应急响应-Windows-挖矿病毒

随着虚拟货币市场的繁荣&#xff0c;挖矿病毒已成为网络安全领域一大挑战。该类病毒利用计算机资源进行加密货币的挖掘&#xff0c;给个人用户和企业网络带来了严重的安全风险。本文将针对挖矿病毒的应急响应和防范措施进行分析和总结。 一.判断挖矿病毒 服务器突然发现CPU资…

CTF例题:[SWPU2019]Web1(无列名注入)

网址&#xff1a;BUUCTF在线评测 搜索web1 启动靶机 点击链接进入题目 进入题目后发现有登录和注册接口&#xff0c;直接注册登录。 首先通过1进行测试&#xff0c;查看是否有注入点 出现报错&#xff0c;说明可能存在注入点 然后继续测试发现该服务器过滤了&#xff1a; or、…

Android 逆向

一、apk 查壳工具 ApkScan-PKID 相关APK文件可以在 豌豆荚 官网下载 ApkScan-PKID查壳工具 下载 - 简书 (jianshu.com) 二、脱壳工具&#xff1a;frida 1、Android端配置 frida-server&#xff1a; 该步骤需要使用到 adb&#xff0c;操作Android文件 Releases frida/frid…