-
一、引用和指针的区别:
指针:从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。
引用:是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。
指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向 某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给 该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
如果操作符[]返回一个指针,那么后一个语句就得这样写:
但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。
-
二、c++ const引用详解
(1)在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。
(2)一旦引用已经定义,它就不能再指向其他的对象.这就是为什么它要被初始化的原因。
(3) const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如:
上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。
引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问。
例如:
编译器将其转换为:
同理:上面代码
(4)不允许非const引用指向需要临时对象的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!
(5)********对于const int *const & pi_ref = &iva; 具体的分析如下:*********
1.不允许非const引用指向需要临时对象的对象或值
2.地址值是不可寻址的值
3.于是,用const对象的地址来初始化一个指向指针的引用
const引用的语义到底是什么?最后,我们可能仍然不明白const引用的这个const的语义是什么
const引用表示,试图通过此引用去(间接)改变其引用的对象的值时,编译器会报错!
这并意味着,此引用所引用的对象也因此变成const类型了。我们仍然可以改变其指向对象的值,只是不通过引用 下面是一个简单的例子:
其中第10行,如果我们通过ir来改变val的值,编译时会出错。但是我们仍然可以通过val直接改变其值(第9行)
总结:const引用只是表明,保证不会通过此引用间接的改变被引用的对象!
另外,const既可以放到类型前又可以放到类型后面,放类型后比较容易理解:
三、值传递、地址传递、指针传递的区别
1、值传递:
值传递是最常见的参数传递方式。当我们将一个值传递给函数时,函数会创建该值的副本,并在函数内部使用这个副本。这意味着函数对该值的修改不会影响到原始值。
优点:
简单直观,易于理解和使用。
函数内部对参数的修改不会影响到原始值,确保了数据的安全性。
缺点:
需要额外的内存来存储参数的副本,可能会导致内存消耗过大。
对于大型对象的传递,值传递会导致性能下降。
适用场景:
对于简单的数据类型,如整数、字符等,值传递是最合适的选择。
当函数不需要修改原始值,只是使用该值时,值传递也是一个不错的选择。
值传递例子:
在这个例子中,我们将一个整数值传递给changeValue
函数。在函数内部,我们将参数num
的值修改为5。然而,当我们在main
函数中打印num
的值时,发现它仍然是10。这是因为在值传递中,函数会创建参数的副本,而不是直接修改原始值。
2、指针传递
指针传递是通过将参数的内存地址传递给函数来实现的。函数可以通过指针来直接访问和修改原始值。
优点:
可以直接修改原始值,避免了创建副本的开销。
对于大型对象的传递,指针传递比值传递更高效。
缺点:
需要手动管理内存,包括分配和释放内存空间。
指针可能为空或者指向无效的内存地址,需要进行有效性检查。
适用场景:
当函数需要修改原始值时,指针传递是一个不错的选择。
对于需要传递大型对象的情况,指针传递可以提高性能。
例子2:指针传递
在这个例子中,我们将指向整数的指针传递给changeValue
函数。在函数内部,我们通过解引用指针来修改原始值。当我们在main
函数中打印num
的值时,发现它已经被修改为5。这是因为指针传递允许函数直接访问和修改原始值。
3、引用传递
引用传递是将参数的引用传递给函数。函数可以通过引用直接访问和修改原始值,而无需创建副本。
优点:
可以直接修改原始值,避免了创建副本的开销。
使用起来更加简洁,不需要手动管理内存。
缺点:
无法传递空值,需要保证引用的有效性。
对于初学者来说,理解引用的概念可能有一定难度。
适用场景:
当函数需要修改原始值时,引用传递是最常用的方式。
对于大型对象的传递,引用传递可以提高性能。
例子3:引用传递
在这个例子中,我们将整数的引用传递给changeValue
函数。在函数内部,我们可以直接修改原始值,而无需使用指针或副本。当我们在main
函数中打印num
的值时,发现它已经被修改为5。这是因为引用传递允许函数直接访问和修改原始值,使得代码更加简洁和易读。
标签:const,函数,对象,知识,c++,传递,引用,指针 From: https://www.cnblogs.com/xuweitao/p/18061195