C++ ——> 引用

本文详细解析了 C++ 中的引用概念,包括其定义、特点、与指针的区别及联系,以及如何在函数参数和返回值中使用引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对引用的理解

(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进奋斗

引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
定义的格式为:
类型&引用变量名 = 已定义过的变量名


从上图就可以很清楚的看出来,引用所建立的这个别名,没有开辟新的内存空间,它的原变量是同一个地址,也就是说,改变引用是可以改变原变量的值,这和指针有相似的地方


如上图改变引用和改变指针都改变了原变量。

引用的特点:
1. 一个变量可取多个别名 

2. 引用必须初始化 

3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量

4.声明一个引用,不是定义一个新的变量,只是目标变量的一个别名,它本身不是一种数据类型,因此引用本身

   不占存储单元,系统也不会给引用分配存储单元

5.不能建立数组的引用,因为数组是由多个数据元素组成的 ,所以无法建立一个数组的引用

6.不能建立引用的引用,不能建立指向引用的指针,但可以建立指针的引用,因为引用不是一种数据类型

引用的用法:

const引用

void TestReference2() {
	int d1 = 4;  
	const int & d2 = d1;   
	d1 = 5;          // d1改变 d2的值也会改变。   
	//d2 = 6;   // 不能给常量(不能被修改的量)赋值

	const int d3 = 1;  
	const int & d4 = d3;    
	//int&d5 = d3;    
	const int & d6 = 5;  // 常量具有常性,只有常引用可以引用常量

	double d7 = 1.1;   
	//int& d8 = d7; //d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量           
	// 也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。   
	const int& d9 = d7; 
}

引用作参数

引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。


可以看出引用和指针的作用一样,都完成了值得交换,因为引用是变量的一个别名,所以对引用操作是直接对原变量直接操作,而且采用值传递时,就会产生形参,并且需要分配存储空间,所以引用比一般的变量传递参数的效率和空间都要好。

引用作返回值

要以引用返回函数值,则函数定义时要按以下格式:
类型标识符 &函数名(形参列表及类型说明)

引用作返回值时需要注意几点:

1.不能返回局部变量的引用,因为局部变量在函数返回后就被销毁了,而被返回的引用就成为了“无所指”的引 用,程序会进出未知状态

2.不能返回函数内部new分配的内存的引用,虽然不存在局部变量的被销毁问题,但是会产生其他的情况,例如

被函数返回的引用是作为一个临时变量的出现,而没有被赋予一个世纪的变量,那么这个引用所指向的空间就无 法释放,从而会造成内存泄漏


如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

引用与指针的区别和联系

1、引用只能在定义时初始化一次,之后不能改变指向别的变量,而指针变量的值可变

2、引用必须指向有效的变量,指针可以为空

3、sizeof引用得到的是引用所指向的变量的大小。sizeof指针是对象地址的大小

4、引用比指针更安全,而指针比引用更灵活,也更危险



### C++ 中 `->` 运算符的使用方法 #### 基本概念 在 C++ 中,`->` 是一种间接访问运算符,主要用于通过指针来访问对象的成员。它通常用于简化指针操作中的成员访问语法[^3]。 #### 用法解释 当有一个指向某个对象的指针时,可以通过 `->` 来直接访问该对象的公有成员,而无需显式解引用指针后再使用点号 (`.`) 访问成员。其作用相当于先对指针进行解引用(即取到实际的对象),然后再对该对象执行成员访问操作。 例如,在以下代码片段中展示了如何利用 `->` 对象指针访问结构体成员: ```cpp struct MyStruct { int x; void display() { std::cout << "Value: " << x << std::endl; } }; MyStruct myObj; MyStruct* pMyObj = &myObj; pMyObj->x = 20; // 使用 -> 通过指针设置成员变量 pMyObj->display(); // 调用指针指向对象的方法 ``` 上述例子表明了两种情况下的应用:一是修改数据成员;二是调用成员函数。 #### 自定义类中重载 `operator->` 除了基本功能外,还可以自定义行为以支持更复杂的场景——比如智能指针的设计模式下就需要重新定义这个操作符的行为逻辑。这允许开发者创建类似于标准库提供的自动管理资源生命周期的功能强大的工具类型[^4]。 这里给出一个简单版本的模板化智能指针实现作为示范: ```cpp template <typename T> class SmartPointer { public: explicit SmartPointer(T* ptr): m_ptr(ptr) {} T* operator->() const { return m_ptr; } private: T* m_ptr; }; ``` 在这个案例里,我们看到每当用户尝试经由SmartPointer实例去请求目标实体上的任何东西的时候,实际上都会触发我们的定制版arrow-operator处理流程,并最终返回原始裸指针对应的结果给调用方继续完成后续动作链路。 另外值得注意的一点是关于箭头运算符的一个有趣的小技巧可以用来计算特定字段相对于整个结构体起始位置字节偏移量[^5]: ```cpp #include <iostream> struct Vector3 { float x, y, z; }; int main(){ int offset_y = (char*)&(((Vector3*)nullptr)->y); std::cout<<offset_y<<std::endl; } ``` 此程序打印出了`y`成员距离结构体首部有多少个字节的距离。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值