C++ 学习之函数传参1:引用传参和非引用传参
2011-04-02 13:15
429 查看
个人认为C++函数传参的一个指导性原则是:若函数的形参是非引用类型,传参时实际上是使用复制实参的值给形参,是实参值的副本,而非真正的实参;若函数的形参是引用类型的,则传递的其实就是实参本身,形参只不过是实参本身的别名而已。
1.非引用类型的形参(牢记关键词——复制实参的副本)
永远不要忘记传递进来的是实参的副本,与实参本身并无“太多直接”关系。
在使用非引用类型形参的时候,如果不需要对实参本身做修改,则直接传递即可。此时const形参,非const形参的值初始化问题五特殊要求,它们只是想用实参的副本值来初始化自己,并无特殊要求。
如果需要对实参本身进行操作或者修改,应该使用指针进行传递。形参复制的是指针的地址,通过修改指针所指地址存储的值来改变实参。
复制实参的局限性:
1)当要传递的实参是很大的对象时,复制对象所有的元素的代价太大;
2)没有办法对要传递的对象进行复制时,如要传递的是数组,而数组不能直接进行复制。
2.引用类型的形参(牢记关键词——实参的别名)
使用引用类型的形参要牢记,此时传递的参数与实参有着直接的关系。
如果使用引用类型的实参的唯一目的是为了避免大量的复制实参,而不对实参做修改,最好使用的形参类型为const 类型名&。
当子使用引用类型的形参时,要注意const在其中的影响。如果传递的实参本来是有const特性的,则不能使用非const类型的形参,这样有违const对象的使用规则。总结一下可以归纳为一下两点:
1)当函数的形参类型是const类型时,可以通过const类型的实参调用函数,也可以用非const类型的实参调用函数。
2)当函数的形参类型是非const类型时,只能用非const类型的实参调用函数。
综上两点可以看出,在不需要修改实参的情况下,函数的形参类型声明为const类型时,初始化的限制条件会相对放松些。所以有一种情况应当引起重视,就是应该吧不需要修改的应用形参定义为const引用。因为普通的非const应用会限制函数的应用,比如,这样的形参不能用const对象初始化,不能用字面值或产生右值的表达式初始化。
1.非引用类型的形参(牢记关键词——复制实参的副本)
永远不要忘记传递进来的是实参的副本,与实参本身并无“太多直接”关系。
在使用非引用类型形参的时候,如果不需要对实参本身做修改,则直接传递即可。此时const形参,非const形参的值初始化问题五特殊要求,它们只是想用实参的副本值来初始化自己,并无特殊要求。
如果需要对实参本身进行操作或者修改,应该使用指针进行传递。形参复制的是指针的地址,通过修改指针所指地址存储的值来改变实参。
复制实参的局限性:
1)当要传递的实参是很大的对象时,复制对象所有的元素的代价太大;
2)没有办法对要传递的对象进行复制时,如要传递的是数组,而数组不能直接进行复制。
2.引用类型的形参(牢记关键词——实参的别名)
使用引用类型的形参要牢记,此时传递的参数与实参有着直接的关系。
如果使用引用类型的实参的唯一目的是为了避免大量的复制实参,而不对实参做修改,最好使用的形参类型为const 类型名&。
当子使用引用类型的形参时,要注意const在其中的影响。如果传递的实参本来是有const特性的,则不能使用非const类型的形参,这样有违const对象的使用规则。总结一下可以归纳为一下两点:
1)当函数的形参类型是const类型时,可以通过const类型的实参调用函数,也可以用非const类型的实参调用函数。
2)当函数的形参类型是非const类型时,只能用非const类型的实参调用函数。
综上两点可以看出,在不需要修改实参的情况下,函数的形参类型声明为const类型时,初始化的限制条件会相对放松些。所以有一种情况应当引起重视,就是应该吧不需要修改的应用形参定义为const引用。因为普通的非const应用会限制函数的应用,比如,这样的形参不能用const对象初始化,不能用字面值或产生右值的表达式初始化。
相关文章推荐
- C++学习笔记1(结构体,命名空间,标准输入输出,引用,函数,构造函数)
- c++学习笔记(四):函数按指针调用和按引用调用
- C++ 学习之函数传参2:vector和数组传参
- C++引用数组,函数指针,函数指针数组,结构体数组等学习
- Java函数传参 Java引用和C++引用的区别
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- c++学习笔记之函数引用返回
- C++学习笔记-函数数组传参
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C++学习总结(十一)——类的静态函数,成员函数的默认参数,类中包含引用和常量
- C++学习之内联函数、引用变量、函数重载、函数模板
- C++学习-引用作为函数参数
- c++学习笔记(返回引用的函数)
- 二级指针和指针引用函数传参(C++)
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- 【C++基础学习】引用和指针、重载、函数、内存管理
- [C++学习笔记]--常量对象、常量成员函数和常引用
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子