>  Q&A  >  본문

C++ 公有方法返回vector与私有vector不是同一个

黄舟黄舟2765일 전796

모든 응답(3)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-17 15:31:27

    返回vector的值当然不是同一个地址了,返回的是已经拷贝过了的。
    可以返回指针,const指针。

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 15:31:27

    返回的值,当然是经过拷贝的啦,你不信的话可以改变一下GetcomputerFishes的返回值,然看看看this->computerFishes的数据是否一致

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:31:27

    为什么地址不一样?

    GetcomputerFishes函数的返回值类型是vector<ComputerFish *>,即按值返回;同时返回语句内的表达式是computerFishes,所以这里会先拷贝构造一个临时对象,然后再返回这个临时对象(注:由于Copy elision,实际运行时不一定真的会拷贝构造这个临时对象)。即返回的对象不是MyClass的成员变量,而是用这个成员变量拷贝构造的一个临时对象,所以他们的地址不一样。(注:按值返回调用时的表达式类型是右值,用户代码是无法直接取返回值的地址的,即无法&x.GetcomputerFishes()。但可以将其转换成左值,然后取地址。)

    如何让GetcomputerFishes返回的对象就是computerFishes?

    想要该函数返回MyClass的私有成员computerFishes,可以用按引用返回。

    vector<ComputerFish *> &GetcomputerFishes() { return computerFishes; }
    const vector<ComputerFish *> &GetcomputerFishes() const { return computerFishes; }
    

    这一组函数重载分别提供对const MyClass对象和非const MyClass对象的支持。

    然后可以用该返回值初始化引用变量(也可以初始化非引用变量,拷贝初始化):

    vector<ComputerFish *> &ref = x.GetcomputerFished();
    ref.clear();
    

    当然也可以通过函数返回值直接访问:

    x.GetcomputerFished().clear();
    

    회신하다
    0
  • 취소회신하다