蛋蛋包子
求助一下關於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裏面,答案只供參考= =還求大神指導之

轻舟过
风音洛洛
展开Biu

风音洛洛 发表于 2013-7-26 13:51

版主我最近刚到家,加上维度跨度太大导致水土不服拉肚子,还请见谅

我也是刚到家的,最近几天网络不好都没怎么上

[查看全文]
风音洛洛
很详细啊
展开Biu

轻舟过 发表于 2013-7-23 01:37

很详细啊,呼唤版主发糖 @风音洛洛 @Mr_Alex

版主我最近刚到家,加上维度跨度太大导致水土不服拉肚子,还请见谅#38m

[查看全文]
轻舟过
在命令行下跑这个测试
展开Biu

jingyixx 发表于 2013-7-19 20:56

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

lz这个 ...

很详细啊,呼唤版主发糖 @风音洛洛 @Mr_Alex

[查看全文]
轻舟过
这个是编译器优化
展开Biu

jingyixx 发表于 2013-7-19 20:35

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

thinking in C++就提过一下返回值编译器有可能会做优化,没有具体展开讲

[查看全文]
jingyixx
第五题用
展开Biu

封獣★ぬえ 发表于 2013-7-21 18:08

第五题用VS2012的结果是:

ctor,ctor,copy,inside foo,copy,dtro,assign,dtor

这个和g++的结果是一样的

[查看全文]
封獣★ぬえ
不拷贝直接
展开Biu

jingyixx 发表于 2013-7-20 11:06

不拷贝直接assign我能理解,奇怪的是前面有个dtor

在这个dtor前面总共创建了3个对象,thing,another和fo ...

第五题用VS2012的结果是:

ctor,ctor,copy,inside foo,copy,dtro,assign,dtor

[查看全文]
jingyixx
蛋蛋包子
展开Biu

蛋蛋包子 发表于 2013-7-20 04:49

超☆感☆謝大神

不過關於第五個,我是測試出來是那幾個constructor。

之後我查了查書,然後大概只有一個c ...

不拷贝直接assign我能理解,奇怪的是前面有个dtor

在这个dtor前面总共创建了3个对象,thing,another和foo参数表种的anobj

这个dtor显然不能是thing和another的,这两个还在scope中

这么一来只能是anobj的了,但是如果anobj被析构了下面的assign怎么进行呢

编译器直接优化成 another=thing好像是唯一的解释了,但是后面的dtor是怎么回事情,assignment不该产生临时对象啊

PS 你用的是VC++ ?

[查看全文]
蛋蛋包子
在命令行下跑这个测试
展开Biu

jingyixx 发表于 2013-7-19 20:56

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

lz这个 ...

超☆感☆謝大神

不過關於第五個,我是測試出來是那幾個constructor。

之後我查了查書,然後大概只有一個copy的原因應該是由於形參在函數結束的時候會被銷毀,因此系統會將返回的臨時賦值給一個對象。然後因為在main裏面another是之前就定義過了構造好了,所以是直接把值賦過去所以在return那裡就沒有用到copy,所以就在第一個dtor的時候銷毀的是一開始的一個copy,但是這樣的話第二個dtor就不知道是哪來的了...

system pause後面的constructor call應該是顯示不出來了才對....

[查看全文]