class People
{
public:
People()
{
cout << " construct fun " << endl;
}
People(const People& i)
:a(i.a)
{
cout << " copy construct " << endl;
}
People &operator=(const People& p)
{
a = p.a;
cout << " operator = " << endl;
return *this;
}
~People()
{
cout << " destory " << endl;
}
private:
int a;
};
People test(People a)
{
cout << " do sth " << endl;
return a;
}
int main()
{
People a,b;
a = test(b);
}
果然如果pass-by-value會導致額外的拷貝構造和析構
而且返回如果是一個object,也需要調用拷貝構造函數和析構函數
class People
{
public:
virtual void print()const
{
cout << " people " << endl;
}
virtual ~People(){}
};
class Man : public People
{
public:
void print()const
{
cout << " Man " << endl;
}
~Man(){}
};
void test1(People p)
{
p.print();
}
void test2(const People * p)
{
p -> print();
}
int main()
{
People *pa = new People();
People a;
Man b;
People *pb = new Man();
test1(a);
test1(b);
//雖然傳遞的是一個Man類型的參數
//但是因爲函數參數是People類型的
//所以Man類型的特性無法顯示出來
//導致也只能輸出People
test2(pa);
test2(pb);
}
對於內置類型,STL迭代器和函數對象,設置成pass-by-value更好(不過後兩者還需要視情況而定)
即使是小型對象有並不昂貴的copy構造函數,效率方面還是有爭議。某些編譯器對於“內置類型”和“用戶自定義類型”的態度截然不同,某些編譯器拒絕把只有一個double組成的對象放到緩存器中,卻很樂意在一個正規基礎上對光禿禿的double那麼做