曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3450|回复: 1
打印 上一主题 下一主题

“引用传递” 方式传递函数参数

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-7-10 15:44:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
给函数参数指针参数是很常见的事情,在函数里修改了指针所指向的值后,主函数里的值也是会改变的。

在 C++ 里引入了一种 "引用传递“ 的参数传递方式,它和上面所说的传递指针的目的相同,它也可以在函数里修改传递过来的变量的值(注意区别于值传递)。这种方式和指针传递的语法不一样。

通过下面的例子可以比较出 "引用传递” 方式传递函数参数和传递指针参数的语法区别:
[C++] 纯文本查看 复制代码
#include <iostream>

void NewParameter (int &New, int i)
{
        New = i;
}

void OldParameter (int *Old, int i)
{
        *Old = i;
}

int main(void)
{
        int k = 10;

        OldParameter (&k, 20);
        std::cout << "k value is: " << k << '\n';

        NewParameter (k, 30);

        std::cout << "k value is: " << k << '\n';

        return 0;
}

运行输出:
$ ./quote
k value is: 20
k value is: 30
在上面的 NewParameter() 函数里,第 1 个参数 int &New 不是一个指针,它是那个将被传递给这个函数的原始变量的一个别名。在 NewParameter()  里对这个参数变量进行的任何操作都将反映在 NewParameter()  函数外的那个原始变量身上。

使用引用的一些限制
1 . 不能引用一个引用变量。
2 . 不能创建引用数组。
3. 不能创建一个指向引用的指针,也就是说,不能将 & 运算符应用于引用。
4. 在位域中不允许使用引用。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2011-8-10 13:38:08 | 只看该作者

返回引用

当函数返回引用时,它返回的是一个指向返回值的隐式指针。这样,函数就可以被放在赋值语句的左边!

示例代码-1
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

double val = 18.8;

double &retquote()
{
    return val;
}

int main()
{
    double newval;
    
    newval = retquote();
    cout << newval << '\\n';
        
    retquote() = 19.9;  // 改变了全局变量 val 的值
    cout << retquote() << '\\n';

    return 0;
}

运行输出:
$ ./return_quote
18.8
19.9
注意上面代码中对 retquote() 函数的返回形式写法。另外,19.9 通过 retquote() 所返回的引用被间接地赋值给了 val 。

示例代码-2
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

double &change_it(int i);
double vals[] = {1.1, 2.2, 3.3, 4.4, 5.5};


int main()
{
    int i;
    cout << "Here are the original values: ";
    for (i = 0; i < 5; i++)
        cout << vals[i] << ' ';
    cout << '\\n';

    change_it(1) = 1314.255;
    change_it(3) = -255.1314;

    cout << "Here are the changed values: ";
    for (i = 0; i < 5; i++)
        cout << vals[i] << ' ';
    cout << '\\n';

    return 0;
}
double &change_it(int i)
{
    return vals[i];
}

运行输出:
$ ./return_quote2
Here are the original values: 1.1 2.2 3.3 4.4 5.5
Here are the changed values: 1.1 1314.26 3.3 -255.131 5.5
程序中队 change_it() 函数声明为返回 double 类型的引用,它返回的是由参数 i 指定的一个数组成员的引用。所以我们对返回值的修改就是对数组元素的修改。

注意,当函数返回一个引用时,被引用的对象不能超过作用区域,比如不能返回一个函数局部变量的引用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 21:44 , Processed in 0.065950 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表