0

从以下代码的最后一行返回的对象会发生什么情况

class weight
{
   int kilogram;
   int gram;
public:
   void getdata ();
   void putdata ();
   void sum_weight (weight,weight) ;
   weight sum_weight (weight) ;
};
weight weight :: sum_weight(weight w2)
{
   weight temp;
   temp.gram = gram + w2.gram;
   temp.kilogram=temp.gram/1000;
   temp.gram=temp.gram%1000;
   temp.kilogram+=kilogram+w2.kilogram;
   return(temp);
}
int main(){
//.....//
   w3=w2.sum_weight(w1);
   w2.sum_weight(w1);
//.....//
}

它会保留在内存中直到完成还是被删除。

4

2 回答 2

0

sum_weight(w1);将返回一个对象,但您没有分配它意味着该对象从未使用过。在第一种情况下w3=w2.sum_weight(w1);,它将调用赋值运算符以及复制构造函数和默认构造函数(即temp)。在第二种情况下,将创建weight(第一个和第二个重量温度;)的两个实例。(weight w2)在退出主方法 O/S 之前,Hance 将调用这两个对象的析构函数。W3 和从语句创建的临时对象w2.sum_weight(w1);(即temp

于 2018-03-16T12:56:03.197 回答
0

让我们试着看看实际发生了什么:

#include <stdio.h>

class A {
    public:
        A() { printf("default constructing at %016zx\n", (size_t)this); }
        A(const A& a) { printf("copy constructing from %016zx at %016zx\n", (size_t)&a, (size_t)this); }
        void operator=(const A& a) { printf("assigning from %016zx to %016zx\n", (size_t)&a, (size_t)this); }
        ~A() { printf("destructing at %016zx\n", (size_t)this); }
        static A makeA() {
            A temp;
            return temp;
        }
};

int main() {
    A a;
    printf("calling makeA()\n");
    a = A::makeA();
    printf("returned from makeA()\n");
}

此代码在我的机器上产生以下输出(没有编译器优化!):

default constructing at 00007ffe39415d0e
calling makeA()
default constructing at 00007ffe39415d0f
assigning from 00007ffe39415d0f to 00007ffe39415d0e
destructing at 00007ffe39415d0f
returned from makeA()
destructing at 00007ffe39415d0e

所以,你看,在调用过程中,变量 inmakeA()被创建,变量 in 的值makeA()被赋值给变量 in main(),而变量 inmakeA()被销毁。变量 in在调用之前创建,并且在返回给调用者main()之前保持有效。main()

于 2018-03-16T12:59:21.810 回答