const 值传递和引用传递
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const 值传递和引用传递相关的知识,希望对你有一定的参考价值。
const关键字,我们用const修饰的变量表明该变量的值以后不可以修改,即相当于常亮,并且在定义的时候应当初始化。
如:const int n = 0;
这和 int const n = 0;是等价的
extern修饰:extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
所以和一般的extern用法没有区别:
file1
extern const int n = 1; //定义并初始化
file2
extern const int n; //声明。然后可以使用
指针:
const int *p,说明p是一个指向int类型const对象的指针,即p指向的对象的值为const不可以进行修改,而p本身可以修改指向另一个int const。
const对象的地址赋值给不是指向const指针也是不行的,因为这样的指针可以通过*p修改指向的值,显然与const不可修改相矛盾。
const int *p;和int const *p;也是等价的
const指针:int *const p;不能修改指向的对象,但可以修改指向的对象的值
int n = 1;
int *const p = &n;
指向const对象的const指针:既不能修改指向的对象,也不能修改指向的对象的值
const int n = 1;
const int * cosnt p = &n;
下面就来看一下const在函数中的使用:用典型的swap来说明
void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } int main() { int x = 1; int y = 2; swap(x, y); cout << x << " " << y << endl; system("pause"); return 0; }
输出:1 2这是典型的swap失败。因为是用的值传递。
我们来看一下这是为什么:
主函数中的x y。
swap函数中的x和y。可以看出和主函数中的地址完全不一样。因为这是值传递,即在调用swap的时候,将值传递给形参,而形参和实参是完全不一样的,占用的内存空间也不一样。所以在swap中交换并不影响实参。
void swap1(int &x, int &y) { int temp; temp = x; x = y; y = temp; }
然后我们来看一下c++中的引用传递。这样就很简单的实现了swap
void swap2(int* x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } //指向的位置不可以变 void swap3(int *const x, int *const y) { int temp; temp = *x; *x = *y; *y = temp; }
然后就是,很常规的通过指针来swap。
引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名。引用的底层就是用const指针来实现的
参考:
http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html
http://blog.csdn.net/Sandeldeng/article/details/52916747
以上是关于const 值传递和引用传递的主要内容,如果未能解决你的问题,请参考以下文章