C++入门经典 笔记 (第十三章)高级引用和指针

来源:互联网 发布:windows桌面程序开发 编辑:程序博客网 时间:2024/06/05 16:47

前面讲到,每次按值将对象传入函数时,都将创建该对象的一个备份。每次按值从函数返回一个对象时,也将创建其备份。对于用户创建的大型对象,备份的代价很高。这将增加程序占用的内存量,而程序的运行速度也将会变慢。按引用传递避免了创建备份以及调用复制构造函数,所以它的效率会更高。

但有一个非常重要的问题是,虽然将指针传递给函数的效率更高,但很危险。如果不想要函数修改对象的值,即要同时获得按值传递的安全性和按引用传递的效率,就必须传递一个指向对象的const指针,这可以禁止对对象调用任何非常量成员函数,从而禁止修改该对象。

什么情况下使用引用以及什么情况下使用指针

一般而言,C++程序员更喜欢使用引用而不是指针,因为它们更清晰,使用起来更容易。然而,引用不能重新赋值,如果需要依次指向不同的对象,就必须使用指针。引用不能为NULL,因此如果要指向的对象可能为NULL,就必须使用指针,而不能使用引用。如果要从堆中分配动态内存,也要使用指针。

程序在堆中分配内存时,将返回一个指针。必须一直让某个指针指向这块内存,因为指针丢失后,便无法释放该内存,进而导致内存泄露。如果我们要编写这样的函数,即它需要分配内存块并将其传递给调用它的函数,应该考虑修改接口:让发出调用的函数分配内存,然后按引用将其传递给被调用的函数,这样,便可以做到在哪个函数中分配内存,就在哪个函数中释放内存了。

问:为何要从函数按值返回?

答:如果返回的是局部对象,即在这个函数中所定义的对象(除去在堆中所定义的对象),必须按值返回,否则返回的引用将指向不存在的对象。

0 0
原创粉丝点击