本帖最后由 jingyixx 于 2013-7-19 21:51 编辑
建议lz在命令行下跑这个测试,第4段代码后面应该还有2个destructor的,在你的system("pause");后面
lz这个问题差不多是看结果猜编译器优化了,除非指定编译器,不然没统一结果的
认真从头看一遍
第一个
首先A thing;会调用default ctor, 下面一句foo的原型是void foo(A&);A thing; //default ctorfoo(thing);
那么是传参,进行一个参数绑定的行为,不会拷贝,中间也没有临时对象产生,所以也不会有dtor。
最后thing会out of scope,调用dtor(在暂停之后)
结果应该是 default ctor; inside foo; dtor
第二个
首先,A thing的时候调用default ctor,下面一句的原型是A foo(A);A thing;foo(thing);
参数类型是A,发生拷贝,所以调用一次copy ctor;
这时候进入到foo内部,输出inside foo;
然后返回一个A,也要进行拷贝,调用一次copy ctor;
最后清理函数的局部变量anobj,调用一次dtor
函数返回的对象没人要,调用一次dtor
暂停后面还有一次dtor
第三个编译器改写了你的代码,直接把对象拷贝到了another当中去,没有让函数返回,为了少产生几个中间对象。
其中A foo(A);应该是被改写成了void foo(A),A another = ... 被改写成了 A another(xxx)之类的。
当然这都是十来年前的书里写的了,现在的实现细节应该已经变了
第四个类似于第三个,因为由拷贝变成了传参,所以可以看到少了一组copy ctor和dtor
第五个就是最普通的情况了,编译器没能识别出这种优化,所以就是常规的调用:
两个对象所以两个default ctor
一次拷贝传值,所以下来是一个copy ctor
进入了函数所以有个inside foo
返回拷贝调用一次copy ctor
然后是赋值,调用了一次assignment operator
清理掉两个临时对象,所以是两次dtor
default,default,copy,inside:destructor,assignment operator,destructor这个答案我怎么看都觉得有问题,dtor前面有两次default ctor和一次copy ctor,如果这时候调用dtor对象就不够了,后面怎么assignment。或许这种编译器产生了莫名其妙的优化,或许是错了……
上面的解释和我这里的测试结果是一致的
第六个foo的原型变成了A& foo(A&);传入的时候是引用,返回的时候也是引用,所以少了两组copy ctor和两组dtor