从以下代码的最后一行返回的对象会发生什么?
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);
//.....//
}
它是否在内存中保留直至完成或被删除。
答案 0 :(得分:0)
sum_weight(w1);
将返回一个对象但你没有指定它意味着对象从未使用过。在第一种情况w3=w2.sum_weight(w1);
中,它将调用赋值运算符以及复制构造函数和默认构造函数(即temp
)
。在第二种情况下,将创建weight
(第一个(weight w2)
和第二个权重temp;)的两个实例。在从主方法O / S退出之前,Hance将调用两个对象的析构函数。 W3和从语句w2.sum_weight(w1);
创建的临时对象(即temp
)
答案 1 :(得分: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
因此,您可以看到,在调用期间,makeA()
中的变量已创建,makeA()
中的变量值将分配给main()
中的变量,而变量位于makeA()
中{1}}被摧毁。 main()
中的变量是在调用之前创建的,并且在main()
返回其调用者之前一直有效。