一、理论部分

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;
}

  

C++学习基础五之函数参数——形参的更多相关文章

  1. Python学习笔记五,函数及其参数

    在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容

  2. C++Premer Plus学习(五)——函数探幽

    一.内联函数 1.优点: 内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适. 2.一个demo #include "stdafx.h" #incl ...

  3. C++学习基础十六-- 函数学习笔记

    C++ Primer 第七章-函数学习笔记 一步一个脚印.循序渐进的学习. 一.参数传递 每次调用函数时,都会重新创建函数所有的形参,此时所传递的实参将会初始化对应的形参. 「如果形参是非引用类型,则 ...

  4. 【Unity|C#】基础篇(4)——函数参数类型(值参/ref/out/params)

    [学习资料] <C#图解教程>(第5章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  5. python学习第五天 ----- 函数

    1. 内置函数 例如: print, round 2.自定义函数: 通过def来定义 def funcname(parameter_list): pass ⑴.参数parameter_list可以没有 ...

  6. Linux基础(五) Shell函数

    Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...

  7. Python基础:10函数参数

    局部命名空间为各个参数值创建了一个名字,一旦函数开始执行,就能访问这个名字了. 在函数调用时,有非关键字参数和关键字参数之分,非关键字参数必须位于关键字参数之前. 在函数定义时,严格的顺序是:位置参数 ...

  8. 【C#基础概念】函数参数默认值和指定传参和方法参数

    函数参数默认值和指定传参 最近在编写代码时发现介绍C#参数默认值不能像PL/SQL那样直接设置default,网上也没有太多详细的资料,自己琢磨并试验后整理成果如下: C#允许在函数声明部分定义默认值 ...

  9. Python学习总结18:函数 参数篇

    1. 判断函数是否可调用 >>> import math >>> x = 1 >>> y = math.sqrt >>> cal ...

随机推荐

  1. Linux的find命令

    使用find命令,可以指定问及那的名称.类别.时间.大小以及权限等,来查找出你想要的文件 语法: fiind  [路径] [参数] [-print] 参数详解: 1.-name  按照文件名查找文件 ...

  2. js中Dom对象的position属性

    首先应该明白什么是流?这个估计也很容易明白,我就不说了.顺便说下,float设置了这个属性就暂时脱离了流的存在,clear后才会到流里面. position:absolute| fixed | rel ...

  3. nl2br() 函数

    nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />).经常用于在线编辑的内容,以便显示. 用法:nl2br(string) 参数 描述 stri ...

  4. 从erase()谈起

    面试中,因为我说自己熟悉C++,就问我一个问题,Vector<int>里, 想把元素为2的节点删除掉.该怎么做. 我已经很久没有用Vector了,但是只有硬着头皮想一下,第一个想起的是re ...

  5. url中的百分号转译

    有一次发现自己输入的url中含有中文的时候,他会转化为%XXXX的格式. 于是想怎么把他给转换回去,于是使用了urllib库 #-*-coding:utf8 -*- import urllib url ...

  6. Ubuntn系统忘记密码的解决方法(虚拟机下同样处理)

    不知道你有没有遇到过忘记了ubuntn系统密码的情况,反正我都了,一段时间没用就很容易忘记密码的,此时无奈只能修改密码了!下面分享一个简单实用的方法: 版本号为: (我用的是V-BOX虚拟机安装的ub ...

  7. python数据结构与算法——图的最短路径(Dijkstra算法)

    # Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...

  8. web安全之http协议

    http协议 全称是超文本传输协议,是web的核心传输机制,也是服务端和客户端之间交换url的首选协议. url url全称是统一资源定器(统一资源标识符) 顾名思义 每一条格式正确且规范,但url都 ...

  9. ✡ leetcode 157. Read N Characters Given Read4 利用read4实现read --------- java

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  10. 《C与指针》第九章练习

    本章问题 1.C语言缺少显示的字符串数据类型,这是一个优点还是一个缺点? answer: (这个问题存在争论(尽管我有一个结论))目前这个方法的优点是字符数组的效率和访问的灵活性,它的缺点是有可能引起 ...