首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

内存有关问题请问

2012-02-09 
内存问题请教boxf(){boxbox1(12,15,18)returnbox1}intmain(void){boxbox2box2f()}请问:类对象是不是

内存问题请教
box   f()
{   box   box1(12,15,18);
    return   box1;
}


int   main(void)
{   box   box2;
    box2=f();
}
请问:类对象是不是存储在栈内存,上面对象box1的作用域在f()内,返回box1应该不对是吧,应该是垃圾是吧.但为什么书上说调用了box类的复制构造函数,不明白,请指教。感谢大家

[解决办法]
因为你返回的是box类型,编译器会进行一些处理让返回的class是正确的.

是调用了一次box的拷贝构造函数构造了一个临时对象,然后用这个临时对象给box2赋值.
当然这是在没有进行返回值优化的情况下的说法
[解决办法]
返回时用复制构造函数形成临时对象

[解决办法]
f()的原型是box f(void);
返回的时候需要以box1为参数构造一个临时对象,相当于return box(box1);
[解决办法]
当函数的返回值为类类型的值时会调用类的复制构造函数。box1是局部的对象,函数终止,结束该对象的生存期,则需要利用复制构造函数创建该对象的一个匿名副本,称为临时副本,以把返回值返回给调用者。
[解决办法]
return box1(12,15,18);
诸位,这个同楼主的效率一样吗
[解决办法]
请问:类对象是不是存储在栈内存,上面对象box1的作用域在f()内,返回box1应该不对是吧,应该是垃圾是吧.但为什么书上说调用了box类的复制构造函数,不明白,请指教。感谢大家


类对象box box1(12,15,18)的确是在栈上分配的内存,但是返回不会是垃圾,这是因为你的返回类型是一个box,那么在返回的时候,系统就会用box1去做为参数拷贝构造一个新的对象来返回,然后再释放到box1,而这那个新对象已经独立存在了,所以不会是垃圾

楼主说的那种返回垃圾的情况是:返回指向栈内存的指针或引用,也就是这样:
char* test()
{
char i= 'f ';
return &i;
}
这里i是栈内存,返回它的指针,而test结束时,i被释放,返回的指针指向了垃圾

复制构造函数也就是拷贝构造函数,楼主要去看一些关于这方面的章节,每本C++里都有的
[解决办法]
return box1(12,15,18);
诸位,这个同楼主的效率一样吗

这个叫返回值命名优化,大部分编译器会进行一些优化处理
[解决办法]
不考虑优化的情况下,基本上是下面这样:


box f()
{ box box1(12,15,18);  //构造函数
return box1;    //box1到返回值的拷贝构造函数,也就是将新对象返回到了f()的调
}               //用处
             //析构box1

int main(void)
{ box box2;        //构造函数
box2=f();    //f()到box2的赋值操作符赋值
}       //析构临时对象和box2


[解决办法]
Xlbdan is right.

热点排行