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

关于视频中的几个疑问

关于视频中的疑问 1.Array Array::printInfo()   //返回值为对象  return *this       //this为指针,*this为对象 (1.)为什么主函数中还能访问printInfo()函数?//   arr1.printInfo(); (2.)arr1.printInfo().setlen(5)是否是调用同一对象的两个成员函数?   //应该怎样理解? 2.Array& Array::printInfo()   //取得是对象Array对象中的函数printInfo()的地址吗?应该怎样理解?

正在回答

3 回答

1、Array arr1 当实例化一个arr1的时候,因为有Array Array::printInfo()存在,系统会创建一个Array类的隐形变量,我们姑且用arr2来表示隐形变量,这时arr1和arr2指向的是不同的地址,有点类似于windows的复制操作。 系统执行arr1.printInfo( return * this)的时候,其实相当于arr1.printInfo( &arr2=*this; return arr2; ),所以arr1.printInfo().setlen(5)就是arr2.setlen(5).因为arr1和arr2指向两个不同的地址,所以是两个对象,所以 arr1.printInfo().setlen(5)是arr2的成员函数。

2、Array arr1 当实例化一个arr1的时候,因为有Array& Array::printInfo()存在 ,系统这时候还会创建一个arr2出来,但是因为有&也就是引用,所以arr2和arr1指向的是同一个地址,这就有点类似于windows的快捷方式。系统执行arr1.printInfo( return * this)的时候其实返回的还是arr2,只是arr2和arr1指向同样的地址,所以arr1.printInfo().setlen(5)相当于arr2.setlen(5)也相当于arr1.setlen(5)。

给个好评吧!赚3分好不容易!

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

全栈港 提问者

非常感谢!
2016-01-08 回复 有任何疑惑可以回复我~

首先实例化了arr1这个对象,当然能访问;返回的是*this这个对象,由内存地址一样可以知道这是同一个对象,所以是调用同一个对象的两个成员函数;这个是引用,你看看前面关于引用的讲解(个人拙见,如有误请大家指正,相互学习)

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

全栈港 提问者

非常感谢!
2016-01-08 回复 有任何疑惑可以回复我~
  1. 因为printInfo函数是public的,所以可以在类外被访问。

  2. 在声明时,类型名后面的&代表其是引用类型。 那么 Array& Array::printInfo() 函数返回类型是“Array引用”。

    而实际代码中 return *this; 语句返回的就是将这个类实例自身。

    所以 arr1.printInfo().setlen 这句代码,在printInfo函数调用后,这里返回的还是arr1自己,所以后面setlen函数就是调用arr1自己的那个。

    也正是因为需要连续调用setlen来对自己进行设置,所以printInfo函数才必须要返回引用类型。如果printInfo的返回类型是普通Array,那么在调用printInfo过后得到的是个临时构造的Array对象,再调用setlen修改的是这个临时对象中的值,不会改变arr1本身。

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

全栈港 提问者

非常感谢!
2016-01-08 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

关于视频中的几个疑问

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