C++入门(引用)

目录

一、引用


一、引用

引用不是定义一个新的变量,而是给已存在的变量取了个别名,编译器不会给引用变量开辟内存空间,它和它引用的变量共用一块内存空间。

格式:

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;
	cout << &a << endl;
	cout << &b << endl;
	return 0;
}

(一)引用的功能1:做函数形参,修改形参影响实参

cpp 复制代码
void swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void swap(int& p1, int& p2)
{
	int tmp = p1;
	p1 = p2;
	p2 = tmp;
}

(二)引用的功能2:做函数形参,减少拷贝,提高效率

cpp 复制代码
struct A {
	int a[100];
	int b;
};

void func(struct A* aa)
{
}

void func(struct A& aa)
{

}

(三)引用的功能3:引用做返回值类型,修改返回对象

(四)引用的功能4:引用做返回值类型,减少拷贝,提高效率

cpp 复制代码
typedef struct SeqList
{
	int* a;
	int size;
	int capacity;
}SL;

void SLInit(SL& sl, int n = 4)
{
	sl.a = (int*)malloc(n * sizeof(int));
	// ...
	sl.size = 0;
	sl.capacity = n;
}

void SLPushBack(SL& sl, int x)
{
	// ...扩容
	sl.a[sl.size] = x;
	sl.size++;
}
int& SLAt(SL& sl, int i)
{
	assert(i < sl.size);
	return sl.a[i];
}

需要注意的是,有的时候返回引用是不安全的的,比如返回一个临时对象的引用,比如如下:

ret是局部对象func结束,ret就销毁的了,返回他的别名本质也一种类似野指针的行为

cpp 复制代码
int& func()
{
	int ret = 0;
	//...

	return ret;
}

int& fxx()
{
	int xxx = 1000;
	//...

	return xxx;
}
相关推荐
xiaoye-duck7 小时前
《C++ 工具库实战》gflags 命令行参数解析库详解
c++·第三方库
狂奔的sherry7 小时前
C++ 宏生成访问函数的代价:访问权限、调试和类型检查
c++·宏·编译·预处理器·类型检查
划破黑暗的第一缕曙光9 小时前
[C++]:5.STL:string(2)
java·c++·redis
INGNIGHT11 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
小超人诞生日记11 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘11 小时前
C++的IO流
开发语言·c++·io流·文件io流
xiangyun6113 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
SunkingYang13 小时前
C++14 vs C++17:新特性对比与用法指南
c++·新特性·用法·c++14·示例·c++17
SunkingYang14 小时前
C++ Lambda 表达式原理详解
c++·lambda·理论·原理·表达式
xiaoye-duck14 小时前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库