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

我想知道那个Array不用Array&的时候返回的*this返回的不是arr1是返回谁的

Array Array::peitrisof()
{
   return *this;
}


正在回答

6 回答

记得之前的课程中有说过拷贝构造函数吗?

对象作为函数的参数传递的时候和对象作为返回值的时候,都会调用拷贝构造函数,所以你将对象作为返回值,会调用拷贝构造函数,也就是说你将会有2个对象。

这个多创建的对象,就是老师口中说的“临时对象”。

验证也很简单,手写一个拷贝构造函数在里面输出点内容就能看出来了。

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

补上楼:

#include <iostream>
using namespace std;
class Test
{
public:    
    Test test1()    
    {       
        return *this;    
    }    int i;
};
int main()
{    
    Test test;    
    Test test2 = test.test1();    
    cout << "test p = " << &test << "*this p = " << &(test2) << endl;
    return 0;
}

输出为:test p = 0x7ffffb4c9b20 *this p = 0x7ffffb4c9b24

可以看到是地址不同的两个Test 实例。


若直接将:

cout << "test p = " << &test << "*this p = " << &(test2) << endl;
//修改为以下代码:
cout << "test p = " << &test << "*this p = " << &(test.test1()) << endl;
//则编译会报 test.cpp:16:67: error: taking address of temporary [-fpermissive] 错,即
//引用返回的临时变量地址而引起的编译性错误


1 回复 有任何疑惑可以回复我~
Array Array::peitrisof(){
   return *this;
}
//可以等价于:
Array temp = Array(arr1->*this);
//等价于:
Array temp = Array(arr1);
//即为一个拷贝构造出的临时变量,对临时变量的操作不会影响到源数据本身。

//而使用&与*时,可以等价于:
Array &temp = arr1;  //别名
Array *temp = &arr1; //指针


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

因此 ,这里面返回的是Array的一个临时对象,在补充一点,当retuen this时 返回的是当前对象的地址

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

当返回类型为类名字时 例如Array 则retuen *this 返回的对象别名 也就是引用,当返回类型为引用时,例如Array& 则return *this返回的时对象本身,因此,如果你想修改值返回类型就要用引用,反之则反。

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

这个this返回的是一个临时的对象-----------课程里老师说的

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

举报

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

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

进入课程

我想知道那个Array不用Array&的时候返回的*this返回的不是arr1是返回谁的

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