c++ 传递常量引用与非引用传值比较

简介

在c++中引入了引用, 而引用其实也就是指针, 只是使用起来更加的方便. 使用使用使得在函数传值时可以为对象创造一个别名, 操作时实际上就是操作原对象本身, 这样的传引用可以避免对象传递时产生临时对象. 这样避免就可以减少很多不必要的时间和空间的开销.

实际例子

class Person {
    string name, address;
public:
	Person();
    virtual ~Person();
    ...
};
class Student: public Person {
    string schoolName, schoolAddress;
public:
    Student();
    ~Student();
    ...
};

我们在函数值传递对象时, 究竟调用了多少次函数. 下面就来说明.

bool validateStudent(Student s);   

Student plato;
bool platoIsOK = validateStudent(plato); 

上面函数创建临时对象时一共调用了6次构造函数, 6次析构函数. 原因 :

  1. 临时对象s会调用Person, Student两次构造和析构
  2. 类本身的成员对象有4个, STL容器的拷贝默认都是深拷贝, 所以4个string对象调用了4次构造函数, 4次析构函数

这还仅仅只是一个简单的对象的值传递, 如果对象的成员在复杂, 继承再多, 甚至函数调用的次数增加, 那么这些调用开销就很惊人了.

现在我们以常量引用再来分析:

bool validateStudent(const Student& s);

Student plato;
bool platoIsOK = validateStudent(plato);

现在函数参数并不会产生临时对象, 也就没有多余的时间和空间的开销, 这样就是对好的.

引用传递可以避免截断问题
使用传值改为传引用能避免对象被截断问题 : 主要影响就在于多态的表现.

同样以上面的为例 :

class Person {
    string name, address;
public:
	Person();
    virtual ~Person();
    virtual void position() { cout << "Person"; }
    ...
};
class Student: public Person {
    string schoolName, schoolAddress;
public:
    Student();
    ~Student();
    virtual void position() { cout << "Student"; }
    ...
};

采用传值的方式, 基类就会被截断, 失去多态性.

void position(Person s)
{
    s.position();	// Person
}

Person plato;
void platoIsOK = position(plato); 

但是采用引用传递就能避免这样的问题.

void position(const Person& s)
{
    s.position();	// Student
}

Student plato;
void platoIsOK = position(plato); 

小结

并不是所有的函数传递都必须用引用, 如果传递的只是普通类型(int, char)最好就使用值传递,这样开销比引用小, 但是如果传递的是对象, STL容器等最好就是传递引用, 常量引用更好.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值