函数形参中的const引用

来源:互联网 发布:三七灰土白灰用量算法 编辑:程序博客网 时间:2024/05/01 08:51

这里将C++ Primer中函数形参章节有关const和引用的问题简单小结如下:

一、非const非引用形参

这个是一个平庸的情形。函数参数通过复制对应的实参实现初始化,函数本身对形参的修改不会影响到实参。传递给这类函数的实参可以是一个const型的对象,也可以是非const的对象。

一个需要注意的事情是,有一个较为特殊的例子是指针形参,也就是形参是指针。这类函数的定义形式是:

int fnExample(int *iValue){......}

同一般的非const非引用情形一样,函数不会修改传递给它的实参(指针),但是,对指针的局部修改将会改变指针所指向的值。如果需要保护指针所指向的值,我们必须将形参定义为指向const对象的指针 :

int fnExample(const int *iValue){........}

此时我们仍然可以传递一个int*型实参给函数,而并不一定需要传递const int*型实参。

二、非引用const型形参

int fnExample(const int iValue){.......}

这种情形事实上与刚刚讨论的指向const对象的指针形参是一致的,我们不可以改变实参的局部副本,但我们既可以传递给函数const对象,也可以传递非const对象。

三、复制实参的局限性

以下几种情形不适宜复制形参,此时需要将形参定义为引用或者指针类型:

1.需要修改实参的值

2.复制对象时间或空间代价过大

3.没有办法复制实参

四、const引用形参

前面提到,对于复制类类型或者大型数组,非引用形参效率太低。此时我们需要将形参定义为引用类型,但如果我们仅仅希望避免复制,而不是为了要改变实参,那么我们应该把形参定义为const引用:

int fnExample(const int &iValue){........}

五、非const引用形参

如果函数没必要修改实参,而仅仅是避免复制,则应该使用const引用,非const引用毫无必要地限制了函数的使用。如果函数具有普通的非const引用形参,则必须给函数传递类型完全一致的非const对象。给这类函数传递一个字面值、一个表达式、或者一个需要进行类型转换的对象都是不允许的。

原创粉丝点击