首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个纠结的有关问题…求大神…

2013-11-29 
一个纠结的问题……求大神……int ret(int &n){return n}和int ret(int n){return n}有区别么?我都试了下,

一个纠结的问题……求大神……
int ret(int &n)
{
    return n;
};



int ret(int n)
{
    return n;
};

有区别么?我都试了下,传参都直接传一个int进去没问题……那么这两种写法有什么差异?

有时候还见到函数声明前面有&符号,又是什么意思……

引用和值传递不同,引用是给变量取别名,也就是说实参和形参是同一个东西。而值传递就不同了,他是一个拷贝,会把实参的值拷贝给形参,也就是说是实参和形参是不同的变量。一般C++中值传递用的少,因为拷贝会有空间和时间上的开销,没必要。

你可以试试这段代码就知道了,把下面两个swap分别测试下



引用和值传递不同,引用是给变量取别名,也就是说实参和形参是同一个东西。而值传递就不同了,他是一个拷贝,会把实参的值拷贝给形参,也就是说是实参和形参是不同的变量。一般C++中值传递用的少,因为拷贝会有空间和时间上的开销,没必要。

你可以试试这段代码就知道了,把下面两个swap分别测试下
#include<iostream>
using namespace std;

void swap(int &a,int &b)
{
    int tmp = a;
    a=b;
    b=tmp;
}

void swap(int a,int b)//引用版
{
    int tmp = a;
    a=b;
    b=tmp;
}

int main(){
    int a=1,b=0;
    swap(a,b);
    cout<<a<<" "<<b<<endl;
    return 0;
}

我在11楼的基础上再详细阐述下:
引用(reference)是C++特有的概念, 实际上他就是一个别名,比如:

int a=1;
int& b=a;    //引用在定义的时候就应该对其进行初始化,在初始化的时候必须赋给其一个同类型的变量名称,
             //而不是具体的值

此时,a是一个声明的整型变量,而b则是变量a的一个引用,实际上a和b是同一个东西,当然也就占用着相同的内存单元,也就是说不论你对a还是b进行操作,实际上影响的是同一个内存单元,这和王二的小名叫狗蛋, 其实王二和狗蛋是同一个人是一个道理。
再回头来看11楼的代码:

void swap(int &a,int &b)
{
    int tmp = a;
    a=b;
    b=tmp;
}

在这个函数中因为形参是引用,所以对形参的修改必然影响到实参,因为形参和实参实际上是同一个东西,所以运行这个函数,a和b的值将会被交换。

void swap(int a,int b)
{
    int tmp = a;
    a=b;
    b=tmp;
}

在这个函数中,形参只是一般的变量,此处的a和b 与 main()函数中的 a和b其实是两套东西,从变量的作用域的角度去考虑的话,swap()函数中的a和b只在swap()函数中起作用,在swap()函数中交换了a和b的值,但是这个操作并没有影响main()函数中的a和b,因为是两套东西。所以在main()中如果输出a和b的值,他们的值并没有被交换。
稍微拓展下:
在C++中形参的传递有三种方式:
(1)值传递,上边那种不能交换a和b值的传递方式就是值传递,即对形参的修改不能影响实参
(2)引用传递,上边那种交换了a和b值的传递方式就是引用传递,即形参的操作影响到了实参
(3)地址传递,对于地址传递,形参应该是指针变量,因为指针指向的是实参的内存空间,所以这个

同样可以影响到实参
下边给出地址传递的一个小函数


#include "stdafx.h"
#include<iostream>

using namespace std;

void swap(int* p1, int* p2)
{
    int tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
};

void main(void)
{
    int a = 1, b = 0;
    int* p1, *p2;
    p1 = &a;
    p2 = &b;
    swap(p1, p2);
    cout<<a<<" "<<b<<endl;
}

热点排行