这里将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对象。给这类函数传递一个字面值、一个表达式、或者一个需要进行类型转换的对象都是不允许的。 |
关于const 与 引用 在函数传参的时候 区别
函数形参中的const引用