为了账号安全,请及时绑定邮箱和手机立即绑定

关于引用的问题

为什么Array& 引用就是 arr1了?  又没有明确表明   &Array=arr1啊!

还有 Array*  怎么就是指针了?不是&Array么?

还有 输出&arr1  变成arr1*可以么?

指针部分没有学先问下谢谢了!


正在回答

4 回答

你说的相关内容在视频中视频作者的代码是这样子的:Array& Array::printInfo(){return *this;}

其实,这涉及到两部分的内容,一个是引用,一个是this指针。

我认为视频作者在讲到这一部分的时候有一个小失误。如楼上所说,&是单目运算符,&修饰的内容是在&的后面,所以&这个引用符修饰的内容应该是后面的类:Array,而前面的Array只是一个类型标识符。

下面进入正题:因为用到了return *this;这个语句,所以在成员函数中用到了参数传递。如果是使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本,副本是临时的,在参数传递完成后就会消失,因此对副本的操作是不会影响函数本身的(也就是视频中的成员函数arr1.Info())。而如果使用引用来传递参数,是对函数本身的操作。

视频中的那段代码,可以拆分成两部分来理解:一是


为了实现链式表达式(也就是视频中在demo.cpp中演示的连续使用.符号,也可以是连等号a=b=c诸如此类),return *this的目的就在于此。通过返回成员函数来实现函数的连续调用。二是为了实现对函数本身的操作(准确来说是对函数的引用),用&引用符后,系统将不会另外分配新的内存来创建一个副本以传递参数,而是直接对函数的引用来进行参数传递,这是发生在同一块内存地址里的。

简单来说,使用引用来传递参数不会拷贝一个副本,直接对函数参数操作,而this指针可以实现链式表达式,这就是那段代码的精华。

最后再科普一点小知识:使用指针来传递参数也不会产生临时副本,因此视频中利用指针传递函数参数与引用在结果上是一致的。

以上内容完全按照个人思路手打出来,时间仓促,因此在语言表达上面可能一时间不太容易理解,也可能会出纰漏。如果有什么疑问可以追问,我将尽力解答,大家共同进步。

6 回复 有任何疑惑可以回复我~
#1

qq_Toloveyousel_0

说的太好了 但是我想问一点 “使用引用来传递参数不会拷贝一个副本,直接对函数参数操作” 这句话是不是说这样就算没有别名 也可以直接引用 对函数进行操作。也就是说引用可以没有别名的?
2017-03-18 回复 有任何疑惑可以回复我~
#2

慕少0116480 回复 qq_Toloveyousel_0

事实上一旦使用了&运算符后跟一个合法标识,编译器就会将其看做一个引用。至于“别名”只是视频作者用一个易于理解的词来代替引用而已,两者没有区别。
2017-03-18 回复 有任何疑惑可以回复我~
#3

面具VS口罩

说得非常好~
2017-04-01 回复 有任何疑惑可以回复我~

我想,你说的第一个问题应该是,引用作了函数的形参。对于这个引用的初始化是在函数调用时,利用虚实结合实现的,即arr1是实参,并且传给了形参,那么即使没有明确表明,也确实是arr1的引用。

举个例子,void swap(int &a){//to  do  },是那个调用函数。而在主函数中有 swap(i); 这个语句,虚实结合后,a就是i的别名了。 

0 回复 有任何疑惑可以回复我~

&和*,都是单目运算符,都应该是放在变量前面的。不存在放在后面这一说。

第一个问题,为什么Array& 引用就是 arr1了?  又没有明确表明   &Array=arr1啊!,有代码没,可以贴出来看看

0 回复 有任何疑惑可以回复我~

&符号有两种意思:1)在表达式中为取地址(如:&a 即获取a变量的地址,打印出来是一串16进制的数字);

                                    2)在声明中为引用(如:int &a = b 即a和b其实是一种东西的两种不同叫法);

*符号    1)在声明中为指针符  int *p = a 即p是指向a的一个指针,打印p为a的地址,即&a

                 2)在表达式中为解地址符,*p 即获取p指向地址的值,打印*p为a的值

3 回复 有任何疑惑可以回复我~
#1

空_ 提问者

那*号和&号放后边是什么意思说了?
2017-01-05 回复 有任何疑惑可以回复我~
#2

空_ 提问者

就是放前放后有区别么?
2017-01-05 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(下)
  • 参与学习       70919    人
  • 解答问题       514    个

封装--面向对象三大特征之一,通过案例让C++所学知识融会贯通

进入课程

关于引用的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信