【C++学习笔记】02-传递常量引用比传值更好

本文深入探讨C++中引用的使用,特别是在函数参数传递中的优势。通过对比值传递和引用传递,阐述了引用如何避免对象复制,节省时间和空间开销,以及如何保持多态性,从而提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://blog.youkuaiyun.com/Function_Dou/article/details/86608247

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

实际例子

以Effective C++条款20的例子来分析

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次析构函数. 原因 :

临时对象s会调用Person, Student两次构造和析构
类本身的成员对象有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容器等最好就是传递引用, 常量引用更好.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值