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 值传递和引用传递的主要内容,如果未能解决你的问题,请参考以下文章

按值返回和通过 const 引用传递时避免临时构造

按值传递比通过 const 引用传递更快的经验法则?

C++ 使用const 引用传递参数

为啥在通过 const 引用传递临时值时调用复制构造函数?

复制赋值运算符应该通过 const 引用还是按值传递?

便宜的值传递与常量引用传递