在c、c++的学习之中,我们会遇见在函数传参过程中const对于函数参数的形容,那么这样的形容对于函数形参的作用就值得我们进行讨论一下。
目录
1.导入
2.作用:保护传值
1.导入
在进行函数形参中cosnt的形容之前,我们有必要讨论一下const形容下的顶层const和底层cosnt。
其中,顶层const:表示任意一个对象为常量;底层cosnt:与指针、数组或者引用等的复合类型有关,即该指针指向或该引用绑定的对象是常量。
例如:
const int a = 100;//顶层cosnt,形容整形变量a为常量
const int *p1 = &a;//底层const,形容整形指针p1指向的对象a为常量
int b = 101;
int *const p2 = &b;//顶层const,形容指针p2本身的值为常量
在上述代码中,根据cosnt对目标内容的限制,我们很轻易能结论:a的值、p1指向的值、p2本身的值是不能做修改的。但是我们可以修改p1本身的值,也可以修改p2指向的值。
所以从cosnt定义的内容角度出发,我们需要着重考虑const对形容变量的不可修改性。也就是说,cosnt形容谁,谁旧具有不可修改性,它的值自然也就不能发生改变。
就像:
const int c = 10;
const int *p3 = &c;
int *p4 = p3;//报错!!!
上述代码中,关于p4的定义就会发生报错,因为对于p3而言,const是作为一种底层const出现的,即p3指向的值不能发生改变。
而p4的定义中,并没有涵盖这一部分内容,也就是说按照p4的定义,意味着我们可以对p3指向的内容进行修改。这样的定义说法很明显是错误的,因为它忽视了p3指向值的不可修改性,导致保密性下降,编译器就会报错。
2.作用:保护传值
在了解到顶层cosnt和底层const之后,我们就可以来看在函数形参中cosnt所扮演的角色了。
在c和c++中,我们见过如下的定义函数形参的方式:
void strcpy(char *strDestination, cosnt char *strScoure)
{
}
从底层cosnt的角度出发,我们能很明显看出上述代码中关于strScoure指向值的不可修改性。也就是说在接下来的函数内容中,不能出现这样的操作内容:
*strScoure = "Ni Hao";
因为这样会对strScoure指向的值发生改变,显然违背了cosnt对它的形容目的。
或者像这样:
char *p = strScoure
因为这样子对p进行定义会存在通过p对strScoure指向值修改的情况,所以这样对p进行定义也是非法的。
那么关于形参中cosnt形容具体作用应该是:
保护传值
因为为了提高参数传递的效率,所以采用了引用参数的方式,而在引用的过程中,我们不希望传递到函数中的参数发生改变,即不影响我们的传值的内容发生改变。也就是说在函数执行过程中,只能对传值进行读取,而不能进行修改。