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

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