#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"ctor"<<endl;
}
~A(){
cout<<"dtor x="<<x<<endl;
}
void operator =(A a){
cout<<a.x<<" wokao"<<endl;
}
int x;
};
A func(A a){
return a;
}
void main(){
A a1;
a1=func(A());
}
輸出結(jié)果:
ctor
ctor
dtor x=-858993460
-858993460 wokao
dtor x=-858993460
dtor x=-858993460
dtor x=-858993460
dtor x=-858993460
Press any key to continue
======================================
為類A添加一個拷貝構(gòu)造函數(shù)后:
#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"ctor"<<endl;
}
A(A& a){
cout<<"copy ctor"<<endl;
}
~A(){
cout<<"dtor x="<<x<<endl;
}
void operator =(A a){
cout<<a.x<<" wokao"<<endl;
}
int x;
};
A func(A a){
return a;
}
void main(){
A a1;
a1=func(A());
}
運行結(jié)果:
ctor
ctor
copy ctor
dtor x=4856604
4856604 wokao
dtor x=4856604
dtor x=-858993460
Press any key to continue
==================================
結(jié)論:
就像C++ Primer中寫到的一樣,如果你不顯示提供一個copy ctor,那么編譯器使用bitwise copy完成copy ctor功能,由于該操作極為簡便,因此編譯器不會進(jìn)行優(yōu)化,需要的時候就進(jìn)行此操作,因此第一段代碼的運行結(jié)果是調(diào)用了3次copy ctor。
如果你自己定義了copy ctor,編譯器會認(rèn)為:我的用戶自己定制了copy ctor,八成要做什么復(fù)雜工作吧,每次copy出一個對象來都得費不少事,那么我還是為他/她進(jìn)行優(yōu)化吧。因此第二段代碼僅僅調(diào)用了1次copy ctor。
P.S.:測試環(huán)境是VC6,如果改用G++編譯器的話,我試驗了一下,結(jié)論就不像前述所說的那樣了,各個編譯器有各自的優(yōu)化策略,總之。
但VC6里面較好的體現(xiàn)出了Lippman的思想。