zoukankan      html  css  js  c++  java
  • C++学习基础五之函数参数——形参

    一、理论部分

    C++中函数形参主要分为两类,如图1所示,

               图1

    总结:

    一、当函数参数为非引用形参时,传进函数体内的是实参的拷贝,(注意,对于基本类型而言,拷贝的是实参的值,对于指针而言拷贝的是实参的地址

    (1)若形参为非const的基本类型,则即可接收const实参,也可接收非const实参。只是在函数体内修改形参的值不影响实参的值。

    因为对于基本类型的形参而言,传递进函数体的是实参拷贝的值,而不是实参本身,所以在函数体内修改实参的值不影响实参。

    (2)若形参为非const的指针类型,则即可接收const实参,也可接收非const实参。在函数体内修改形参的值会影响实参的值。

    因为对于指针类型的形参而言,传递近函数体的是实参指针地址的拷贝,形参指针和实参指针指向同一个地址,修改实参指针所指向的值会影响实参指针的所指向的值。

    (3)若形参为const的基本类型,则即可接收const实参,也可接收非const实参。只是在函数体内不能修改形参的值。

    (4)若形参为const的指针类型,则只能接收const类型的指针实参,不能接收非const的指针实参。

    const指针的初始化规则:可以将指向const对象的指针指向非const对象,不可以将指向为非const对象的指针指向const对象。

    二、当函数为引用形参时,传递近函数体内的是实参本身,因为引用就是变量的别名,改变引用的值同时会影响变量的值。

    (1)引用形参是实参的别名,可以达到修改实参的目的。

    (2)引用形参可以额外的返回值。

    (3)对于函数体内不修改形参值的情况,应该将形参设置为const &,即const引用,可减少值的拷贝赋值。

    (4)指向指针的引用若在函数体进行改变,则改变的是指针所指向对象的值。

    二、代码片段如下:

    代码片段1:
    int add_1(int x,int y)
    {
    	return x+y;
    }
    
    int add_2(const int x,const int y)
    {
            //x++;//error,const参数不能修改
    	return x+y;
    }
    int main()
    {
    	int a=1,b=2;
    	const int m=9;
    	const int n=8;
    	add_1(a,b);//ok
    	add_1(m,n);//ok
    	add_2(m,n);//ok
    	add_2(a,b); //ok
    	return 0;
    }
    

    片段1中得出的结论:

    当形参类型为基本数据类型时,非const形参可以接收const实参,同时也可以接收非const实参;
    当形参类型为基本数据类型时,const形参可以接收const实参,同时也可以接收非const实参。
    当形参为const参数时,不能在函数体内修改该形参的值。
     
    代码片段2:
    void add_1(int *a)
    {
    	*a =  *a +1;
    }
    
    void add_2(const int *a)
    {
    	//*a = *a +2;//error,因为该指针指向const常量,不能修改常量的值 
    }
    
    int add_3(const int *a)
    {
    	return *a +2;
    } 
    int main()
    {
    	int a = 1,b=2,c=3;
    	const int a2 = 10;
    	const int b2 = 20;
    	const int c2 = 30;
    	add_1(&a);//ok
    //	add_1(&a2);//error
    	
    	add_3(&a);//ok
    	add_3(&a2);//ok
    	return 0;
    } 
    

    片段2中得出的结论:

    当形参为const指针时,不能修改指针所指向的值。
    当形参为非const指针时,只能接收非const指针实参,不能接收const指针实参。
    当形参为const指针时,既可以接收非const指针实参, 也可以接收const指针实参。
     
    代码片段3:
    //引用形参,是实参的别名,修改的是实参的值 
    void add(int &x)
    {
    	x = x +1 ;
    }
    //引用形参相当于额外的返回值
    
    void fuc2(int i,int j,int &jf,int &jf2,int &cf,int &cf2)
    {
    	jf = i + j;
    	jf2 = i - j;
    	cf = i * j;
    	cf2 = i /j;
    } 
    
    //在函数体内不需要修改的形参都应该设置为const &,即const引用 
    
    //指向地址的 引用
    void cund(int *&x,int *&y)
    {
    	int *temp = y;
    	y = x;
    	x = temp;
    } 
    int main()
    {
    	int i = 9;
    	cout<<"before "<<i<<endl;//9
    	add(i);
    	cout<<"after "<<i<<endl;//10
    	int j = 20;
    	
    	int v1,v2,v3,v4;
    	fuc2(i,j,v1,v2,v3,v4);
    	
    	cout<<"加法结果:"<<v1<<endl;
    	cout<<"减法结果:"<<v2<<endl;
    	cout<<"乘法结果:"<<v3<<endl;
    	cout<<"除法结果:"<<v4<<endl;
    	
    	cout<<"==========================="<<endl;
    	int *ptri = &i;// ptri指针指向i
    	int *ptrj = &j;// ptrj指针指向j 
    	cout<<"交换之前:"<<i <<" , "<<j<<endl;          //i = 10  j = 20
    	cout<<"交换之前-指针:"<<*ptri <<" , "<<*ptrj<<endl;  //*ptri = 10   *ptrj = 20
    	cund(ptri,ptrj);//交换的是指针的值,不是i,j的值 
    	cout<<"交换之后:"<<i <<" , "<<j<<endl;          //i = 10  j = 20
    	cout<<"交换之后-指针:"<<*ptri <<" , "<<*ptrj<<endl;  //*ptri = 20  *ptrj = 20
    	return 0;
    }
    

      

  • 相关阅读:
    window.open的小技巧分享
    2019实习笔试编程题刷题心得
    剑指offer——面试题32.1:分行从上到下打印二叉树
    剑指offer——面试题32:从上到下打印二叉树
    剑指offer——面试题30:包含min函数的栈
    剑指offer——面试题29:顺时针打印矩阵
    字节跳动2018校招测试开发方向(第二批)
    剑指offer——面试题27:二叉树的镜像
    剑指offer——二叉树
    剑指offer——面试题26:判断二叉树B是否为二叉树A的子结构
  • 原文地址:https://www.cnblogs.com/calence/p/5785983.html
Copyright © 2011-2022 走看看