recherche

Maison  >  Questions et réponses  >  le corps du texte

C++值返回生命周期

如下代码两个问题:
1,重载后置++,返回了的一个局部对象,这个局部对象是否会被析构销毁?
2,这里为什么返回的是Coordinate,而不是Coordinate& ?

class Coordinate{
public:
    Coordinate(int x,int y):x(x),y(y){}
    ~Coordinate(){}
    Coordinate operator++(int)
    {
        Coordinate o=*this;
        ++x;
        ++y;
        return o;
    }
private:
    int x;
    int y;
};
天蓬老师天蓬老师2773 Il y a quelques jours370

répondre à tous(7)je répondrai

  • PHP中文网

    PHP中文网2017-04-17 13:53:03

    离开 opertor++ 这个 o 就被销毁了,但是应该返回的是 o 的复本。

    这里返回 Coordinate 应该会产生复本,但是如果返回 Coordinate& 的话,现在的代码会出错,因为 o 已经被销毁,反正它的引用也没用了。但是如果你的 onew 出来,又存在需要找个适当的地方 delete 的问题。

    因为好多年没写 C++ 了,所以不是很确定,你自己可以调试一下,把几个对象的地址输出比较一下就明白了。

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 13:53:03

    1,重载后置++,返回了的一个局部对象,这个局部对象是否会被析构销毁?

    是。

    2,这里为什么返回的是Coordinate,而不是Coordinate& ?

    返回非静态局部变量的引用是未定义行为。

    répondre
    0
  • 怪我咯

    怪我咯2017-04-17 13:53:03

    1和2貌似是一个问题。

    o是operator++中的局部变量,如果返回对它的引用,在operator++结束后,该引用的值的是一个未定义行为,所以返回一份拷贝。

    前置自增才返回引用,因为引用的是*this

    répondre
    0
  • PHPz

    PHPz2017-04-17 13:53:03

    后缀++的和前缀不同,语义就是返回一个表示原来值的临时对象,而产生的临时对象肯定会被析构。

    répondre
    0
  • PHPz

    PHPz2017-04-17 13:53:03

    首先一个类内有后置++,那就应该要有前置++
    那么代码就该这样写:

    class Coordinate{
    public:
        Coordinate(int x,int y):x(x),y(y){}
        ~Coordinate(){}
        Coordinate operator++(int)
        {
            Coordinate o=*this;
            ++*this;
            return o;
        }
    private:
        int x;
        int y;
    };

    既然这样的话就必须返回复本,而不是引用

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:53:03

    1. 返回o会使o赋给一个临时变量,如果这个临时变量被引用,则会延迟销毁.
      在C++标准第12章第2节:临时对象中有说到两种临时对象延迟销毁的情况,一是被用来初始化另一个对象,二是被引用后,直到引用被销毁临时对象才被销毁.

    注意:返回的对象早已被销毁,但临时对象在两种特殊情况下延迟销毁.
    
    1. 不返回引用这是后置++决定的.你必须返回原对象,但又得实现自增操作.返回引用的话就违反了后置++的特点:先使用再自增.

      BTY,对比前置++和后置++,对非内置类型来说,是前置++效率更高.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 13:53:03

    因为返回的是一个拷贝的临时量, 出了作用域就会被析构. 因此如果返回其引用, 那么返回值是不确定的.

    répondre
    0
  • Annulerrépondre