关于引用

引用必须初始化;

一般在初始化变量时,初始值会被拷贝到新建对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始化对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。

引用并非对象,只是为一个已经存在的对象所起的另外一个名字。

定义一个引用后,对其进行的所有操作都是在与之绑定的对象上进行的。

为引用赋值,实际上是把值赋给了与引用绑定的对象。

因为引用不是一个对象,所以不能定义引用的引用。

int &b = 10l;//引用类型初始值必须是一个对象,不能是常数;
double a = 3.2;
int &c = a;//此处引用初始值必须是int型对象;


拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本不支持拷贝操作。当某种类型不支持拷贝操作时幂函数只能通过引用形参访问该类型的对象。

比如编写比较两个string对象的长度,因为string对象可能会比较长,所以尽量避免直接拷贝它们,使用引用形参是比较明智的做法。又因为比较长度无须改变string对象的的内容,所以把形参定义成对常量的引用。

bool isShorter(const string &s1,const string &s2)
{
	return s1.size()<s2.size();
}
注:如果函数无须改变引用形参的值,最后将其声明为常量引用。


在C++中,引用和指针是两个重要的概念,它们都用于间接访问内存中的数据,但在语义、使用方式和行为上存在显著差异。以下是它们的主要区别: 1. **初始化要求**:引用必须在声明时进行初始化,并且之后不能改变其绑定的对象;而指针可以在任何时候被赋值,也可以不初始化(即可以为`nullptr`)。 2. **空值支持**:引用不能为空,它总是指向一个有效的对象或函数;而指针可以为空,表示它不指向任何对象。 3. **重新绑定能力**:一旦引用初始化为某个对象,就不能再被修改以引用另一个对象;而指针可以通过简单的赋值操作指向另一个对象。 4. **操作符重载**:当需要实现类似内置类型的操作时,使用引用通常更为方便,因为引用可以直接参与运算符重载,而指针则可能需要额外的解引用操作。 5. **安全性**:由于引用不能为空并且始终有效,因此它们比指针更安全。然而,这也意味着如果原始对象被销毁,引用将成为“悬空引用”,尽管这种情况相对少见。 6. **语法简洁性**:引用提供了一种更加直观的方式来操作变量,不需要像指针那样频繁地使用星号(*)来解引用或者取地址符号(&)来获取地址。 7. **作为函数参数传递**:通过引用传递参数给函数可以避免复制大对象带来的性能损失,并允许函数修改调用者提供的实际参数。相比之下,除非明确指定否则通过指针传递不会自动防止拷贝,而且需要处理指针本身的生命周期问题。 8. **数组兼容性**:指针可以直接指向数组并利用指针算术遍历数组元素;而直接对整个数组建立引用较为复杂,但可以通过模板技术实现特定大小数组的引用。 基于以上分析,若有一个选项声称“引用可以在不绑定到任何对象的情况下存在”,那么这个描述就是不正确的,因为它违背了引用的基本规则之一——每个引用都必须绑定到一个存在的对象上[^1]。 ```cpp int main() { int value = 10; int& ref = value; // 正确:ref绑定到value int* ptr = &value; // 正确:ptr指向value // 错误示例 - 尝试创建未绑定的引用会导致编译错误 // int& unboundRef; // 编译错误:'unboundRef'声明为引用但未初始化 return 0; } ``` 该代码片段展示了如何正确地声明和初始化一个引用以及一个指针,同时注释指出尝试声明未初始化引用将导致编译错误,这进一步证明了上述关于引用不能为空的观点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值