C ++中引用的参数

时间:2015-11-19 21:20:59

标签: c++ reference

这更像是一个道德问题:

如果我有以下代码:

void changeInt(int& value)
{
value = 7;
}

我做:

int number = 3;
changeInt(number);

数字将具有值7

我知道当为changeInt函数创建新的堆栈帧时,将创建新变量并且& value将指向数字。

我在这里担心的是,如果调用者没有注意,可以通过思考传递值实际上在函数框架上创建引用来愚弄。

我知道他可以查看头文件,这是一个完美的合法表达,但我发现它有点不道德:))

我认为这应该以某种方式标记并通过语法强制执行。就像在C#中你有ref关键字一样。

你们有什么想法?

2 个答案:

答案 0 :(得分:0)

这是引用不如指针清晰的事情之一。但是,使用指针可能会导致类似这样的事情:

changeInt(NULL);

他们确实应该做的事情:

changeInt(&number);

同样糟糕。如果函数的名称如此明确,那么它实际上会改变传入的值并不是一个谜。

另一种解决方案当然是:

int calculateNewInt(/* may need some input */)
{
   return 7; 
}

现在

int number = 3;
...
number = calculateNewInt();

显然(可能)正在改变number

但是如果函数的名称“听起来像是改变了输入值”,那么更改值肯定是公平的。如有疑问,请阅读文件。如果您编写的代码具有您不想更改的局部变量,请将它们设为const

const int number = 3;
changeInt(number);    /* Makes an error */

(当然,这意味着其他地方的数字也无法改变。)

答案 1 :(得分:0)

  

我知道他可以查看头文件,这是一个完美的合法表达,但我发现它有点不道德:))

我认为这是完全正常的,也是语言的一部分。实际上,这是C和C ++的坏处之一:在处理未知API时,您必须始终检查标头,因为在调用函数时,您不会明确地通过引用传递。

但并非所有系统语言都是如此。 IIRC Rust强制要求明确传递引用。