以传引用方式传递对象,特别是自定义类型
1.可以提高效率
例子:
Person是基类,Student继承自Person
传值方式函数: bool validateStudent(Student s);
传引用方式函数:bool validateStudent(const Student &s);
Student plato;
bool platoIsOK = validateStudent(plato);
以传值方式传递plato,将会执行一次Person的copy构造函数,一次Student的copy构造函数。当函数内德Student复件被销毁时,又将调用它们的析构函数。
以传引用方式传递plato,没有任何构造函数或者析构函数被调用,因为没有任何新对象被创建。
2.可以防止对象切割
对象切割:当一个derived class对象以传值方式传递并被当做一个base class对象,base class的copy构造函数会被调用,而造成传入的对象就像个基类对象,丧失了子类对象的所有特性。
例子:
Person是基类,Student继承自Person
传值方式函数: bool validateStudent(Person s);
传引用方式函数:bool validateStudent(const Person &s);
Student plato;
bool platoIsOK = validateStudent(plato);
传值方式,plato传入后其副本将是一个基类对象,丧失子类对象特性,传递失败。。。
传引用方式,传入的是什么对象就是什么对象,因为没有构造函数被调用
3.函数绝对不要返回指针或者引用指向一个栈对象;
函数绝对不要返回引用指向一个堆对象,因为无法获取其引用背后的那个指针,将导致内存泄露;
函数不要返回指针或者引用指向一个局部静态对象(而有可能同时需要多个这样的对象)//P94