您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-31 00:42 489 查看
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那么做
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息