蛋蛋包子
求助一下關於C++調用構造函數的問題

本帖最后由 蛋蛋包子 于 2013-7-19 05:31 编辑

#km無論怎樣的看不懂啦....要求下面的那些題目調用了哪些構造函數(default,copy,destructor,assignment operator)

求大神能詳細指導一下麼?比如說在哪一句用了哪個構造函數

class A

{

public:

A();

A(const A&);

~A();

void operator = (const A&);

};

A::A(){cout<<"default constructor called\n";}

A::A(const A&){cout<<"copy constructor called\n";}

A::~A(){cout<<"destructor called\n";}

void A::operator=(const A& right_side){cout<<"assighnment operator called\n";}

這個是前面的定義。問題有6個..

第一個

void foo(A& anobj)

{

cout<<"inside foo\n";

}

int main()

{

A thing;

foo(thing);

system("pause");

return 0;

}

用了default,但是求大神講解一下爲什麽只用了default...

第二個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

foo(thing); //the returned object is destructed

system("pause");

return 0;

}

這個用了default,copy,in side foo:copy,destructor,destructor

前面的一個default是main裏面的A thing這一句call出來的,copy的話是不是A foo(A anobj)這一句結束后call出來的還是說是在foo(thing)這裡?然後那個return的話是不是都要調用一個copy,所以在foo裏面有一個copy,然後題後面說了那個return後面的object會被刪掉,也就是說所以在return一完,就會有一個destru被call,然後整個foo run完,又調用一個destru 刪掉了一開始的一個copy。不知道這樣理解對不對...

第三個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another=foo(thing);

system("pause");

return 0;

}

default,copy,inside foo:copy,destructor

這個爲什麽只有一個destructor?就是說foo(thing)和A another=foo(thing)的各自作用到底是什麽...

第四個

A foo(A& anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another=foo(thing);

system("pause");

return 0;

}

default,copy。除了default就完全沒看懂了= =&這個符號在這裡是指的是地址還是說指的是reference..?

第五個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another;

another=foo(thing);

system("pause");

return 0;

}

default,default,copy,inside:destructor,assignment operator,destructor

一開始的兩個default知道,copy的話不是很確定是在哪裡call出來的。assignment operator的話應該是another=foo(thing)這裡被call出來的吧。其他的都不知道是怎麼來的Orz

第六個

A& foo(A& anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another;

another=foo(thing);

system("pause");

return 0;

}

default,default,assignment operator

上面的inside foo後面的哪些constructor我不是能肯定到底是不是在foo裏面,答案只供參考= =還求大神指導之

jingyixx
本帖最后由
展开Biu

本帖最后由 jingyixx 于 2013-7-19 21:51 编辑

建议lz在命令行下跑这个测试,第4段代码后面应该还有2个destructor的,在你的system("pause");后面

lz这个问题差不多是看结果猜编译器优化了,除非指定编译器,不然没统一结果的

认真从头看一遍

第一个

A thing; //default ctor

foo(thing);

首先A thing;会调用default ctor, 下面一句foo的原型是void foo(A&);

那么是传参,进行一个参数绑定的行为,不会拷贝,中间也没有临时对象产生,所以也不会有dtor。

最后thing会out of scope,调用dtor(在暂停之后)

结果应该是 default ctor; inside foo; dtor

第二个

A thing;

foo(thing);

首先,A thing的时候调用default ctor,下面一句的原型是A foo(A);

参数类型是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

[查看全文]
jingyixx
第一个就是
展开Biu

轻舟过 发表于 2013-7-19 15:34

第一个就是A thing那里用了default构造函数,函数foo传参数的时候因为传的是引用,所以不构造新的对象,所 ...

这个是编译器优化,大概就是一个NRV,估计Thinking in cpp也不会讲,inside the cpp model中有讲过

[查看全文]
轻舟过
第一个就是
展开Biu

第一个就是A thing那里用了default构造函数,函数foo传参数的时候因为传的是引用,所以不构造新的对象,所以也就没有调用任何构造函数了

第二个里面的foo函数是传值的,所以需要用到拷贝构造函数,然后返回的时候差不多像你说的那样。

第三个里面的A another=foo(thing);其实是会调用拷贝构造函数来构造another的,不过为什么析构函数少了就不太清楚了,有可能是编译器的优化?我得回去翻翻thinking in c++

[查看全文]