c/c 函数形参包含字符以及const-尊龙官方平台

c/c 函数形参包含字符以及const

el/2024/3/25 17:10:07

c/c 函数形参包含字符&以及const

假定现在有个函数声明:

void foo(const int &a)

这里的const以及&有什么作用呢?

考虑如下四种情形:

void foo(int a)
void foo(const int a)
void foo(int &a)
void foo(const int &a)

下面我们一一进行对比:

情形1:

#include using namespace std;void foo(int a)
{/*这里的变量a仅仅是main作用域中变量a的一个副本,一个copy,对于副本的修改,不会影响到main作用域中变量a的值*/a = 10; 
}int main()
{int a = 20; cout<cout<return 0;
}

情形2:

#include using namespace std;void foo(const int a)
{/*对const类型的变量进行修改将会出错*/a = 10; 
}int main()
{int a = 20; cout<cout<return 0;
}[jiang@eb50 04]$ g   -o main main.c 
main.c: in function ‘void foo(int)’:
main.c:8: 错误:assignment of read-only parameter ‘a’

情形3:

#include using namespace std;void foo(int &a) 
{/*此时a是引用传递,所以,修改foo中的a实际是修改main作用域中的a,换句话说,foo中与main中的a是同一个*//*在main中进行foo(a);调用时没有为a创建新的变量(如果是值传递,那么将创建新的变量并将现有变量的值copy到新变量中)*/a = 10; 
}int main()
{int a = 20; cout<cout<return 0;
}[jiang@eb50 04]$ g   -o main main.c 
[jiang@eb50 04]$ ./main 
20
10

情形4:

#include using namespace std;void foo(const int &a) 
{//a = 10;
}int main()
{int a = 20; cout<cout<return 0;
}

现在总结下:

在形参中用const修饰的变量,无论其是否是引用都不能被修改;
形参中变量前加字符&代表引用传递,也即:在主调函数调用被调函数时,不再建立形参的副本,而是直接把引用传递过去,类似将指针传递过去,对引用的修改将会反映到主调函数中。

加上&可以节省空间,提高效率,尤其是当参数为复杂的数据类型时尤为有用~但是又担心,万一不小心修改了,那岂不是会影响主调函数吗?那就加上const吧,就是上面的情形4,既具有引用传递的优点,还可以防止不小心修改错误。

如果我解释得不清楚,可以参考:

http://bbs.csdn.net/topics/320068352

本文也是来源于这边文章进行试验所得~

参考资料:

1.http://bbs.csdn.net/topics/320068352


http://www.ngui.cc/el/5127188.html

相关文章

centos-7设置开机进入文本界面(不进入图形界面)

centos-7设置开机进入文本界面(不进入图形界面) 默认centos-7安装完毕后会进入图形界面,曾尝试如同centos-6那样直接设置/etc/inittab文件: # default runlevel. the runlevels used are: # 0 - halt (do not set initdefault…

硬链接与软链接(符号链接)

硬链接与软链接(符号链接) 软链接即符号链接。 在unix以及类unix系统中常可以见到这两个概念:软链接、硬链接。 那么什么是软链接,什么是硬链接呢? 首先说下什么是文件。 所谓文件,我个人认为其实就是…

c 中vector find使用

c中vector find使用 不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。 话不多说,上代码: #include #include #include

野指针(悬挂指针)

野指针(悬挂指针) 野指针:一个指针变量指向一个错误的地址,即,这个指针变量中存着的值是一个污数据,是无效的,错误的,无用的。 野指针即悬挂指针。 野指针的核心概念:一个…

linux配置java环境(jdk)

linux配置java环境(jdk) 首先从oracle尊龙官方平台官网下载jdk安装包: 这里给出oracle尊龙官方平台官网:https://www.oracle.com 在哪里下载应该能找到,这些就不赘述了。 注:下述以“#”开头的为我的注释,非执行语句…

c/c 变量作用域

c/c变量作用域 今天忽然想起作用域的问题,随手试验了下。 代码: #include #include // mark1 int n1; // scope 1 >>>int main() {printf("i:%d\n", n);// mark2int n2;// scope 2 >>>p…

c 中list、deque以及vector对比

c中list、deque以及vector对比 c的容器类包括两大类: 1.顺序存储结构,包括vector、list、deque等等; 2.关联存储结构,包括set、map、multiset等等; 本文主要对比vector、list以及deque这三种顺序存储结构。 注&am…

打擂台排序与冒泡排序(未完)

打擂台排序与冒泡排序 c code: #include #include void print_array(int *array, int n) {int i;for (i0; i

linux下安装valgrind工具

linux下安装valgrind工具 valgrind是一款很优秀的内存泄漏检测工具。 下面介绍如何在linux下安装valgrind。 首先下载安装包到/root目录下(或者其他目录); [rootlocalhost ~]# ll total 7200 -rw-------. 1 root root 2692 apr 10 13:52 a…

简单选择排序(simple select sort)

简单选择排序(simple select sort) 简单选择排序是入门级别的排序算法,算法易懂,实现简单。 假设现在有一个待排序序列,长度是n,要求从小到大排序。 简单选择排序将要进行n-1次外循环(不需要进行…
网站地图