zoukankan      html  css  js  c++  java
  • 第七章 函数

    1.函数的定义:

      函数主要包括:返回类型、函数名、形参表、函数体几个部分组成。

    2.函数参数的传递:

      (1)非引用型形参:参数是通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的本身。如:int gcd(int v1,int v2)

        {

          while(v2){

                int temp=v2;

                v2=v1%v2;

                v1=temp;

              }

          return v1;

        }

    循环体虽然修改了v1,v2的值,但这些变化仅限于局部参数,而对调用gcd函数使用的实参没有任何的影响。

      (2)指针形参:函数的形参可以是指针,此时将复制实参指针。与其他的非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针值赋给形参,主调函数使用的实参指针的值没有改变。如:void reset(int *ip){}

      (3)const形参:在调用函数时,如果使用非引用非const形参,则既可以给该函数传递const实参也可以传递非const的实参

    如果将形参定义为非引用的const类型:void fcn(const int i){}   则在函数中,不可以改变实参的局部副本(意思就是说因为形参是const类型的,在函数体中不能改变这个形参的值)。由于实参仍然是以副本的形式传递的,因此传递给fcn的既可以是const对象也可以是非const对象。

    以上三种都是采用复制实参的形式传递参数的,存在一定的局限性:1.当需要在函数中修改实在的时候,2.但需要以大型对象作为实参传递时,对实际的应用而言,复制操作所付出的时间和存储空间代价往往过大,3.当没有办法实现对象的复制时。这三种情况下不宜采用复制实参的形式。

      (4)引用形参:与所有引用一样,引用形参直接关联到其所绑定的对象,而并非是这些对象的副本。定义引用时,必须用与该引用绑定的对象初始化该引用。通过引用形参可以修改实参的值。如 void swap(int  &v1,int  &v2 ){}

    《1》使用引用形参返回额外的信息:由于函数只能返回单个值,而有些时候,函数有不止一个的内容需要返回。我们可以定义一个引用型的形参来返回相应的值。如:vector<int>::const_iterator   find_val(vector<int>::const_iterator   beg,vector<int>::const_iterator  end,int  val,vector<int>::size_type  &occur){},在函数体中通过改变occur的值,相应的实参的值也随之改变,从而达到返回参数的目的。

    《2》利用const引用避免复制:在想函数传递大型对象时,需要使用引用形参,这是引用形参适用的另一种情况。如: bool  isshorter(const  string &s1 ,const string &s2){},此种方式形参只是引用实参并不能修改实参。

    《3》对于非const引用形参只能与完全同类型的非const对象关联。应该将不修改相应实参的形参定义为const引用。

    《4》传递指向指针的引用:void ptswap(int *&v1 ,int *&v2){},形参int *&v1的定义应该从右至左理解,v1是一个引用。与指向int型对象的指针相关联。注意:指针的引用关联的是指针,改变的也是指针。而指针指向的值并没有改变。

    《5》数组形参:其数组形参的定义方式:void printvalue(int  *){},void printvalue(int []){},void printvalue(int  [10]){}.虽然形参的表示方式不同,但是可以将使用数组语法定义的形参看做指向数组元素类型的指针。在这种情况下,编译器会忽略数组的长度。如:void printvalue(int  ia[10]){}.这时候数组长度10编译器会忽略。 

    通过引用传递数组:void printvalue(int  (&ia)[10]){},此时数组的长度10也是形参的一部分。

    <6>传递给函数的数组的处理:有三种常见的编程技巧确保函数的操作不超过数组实参的边界。

    1.在数组本身放置一个编辑来检测数组的结束。如C风格字符串采用这种方式。

    2.传递指向数组第一个和最后一个元素的下一个位置的指针。如:void printvalue(const int  *beg,const  int  *end){},int j[2]={0,1}; printvalue(j,j+2);

    3.将第二个形参定义为表示数组的长度。void printvalue(const int ia[] ,size_t  size ){}。

                              

                                (后续)                                          

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/ljy2013/p/3281632.html
Copyright © 2011-2022 走看看