effective c++:寧以pass-by-reference-to-const替代pass-by-value

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那麼做

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章