在C ++中,如何定义和声明一个只能不接受任何通过值传递的参数的函数。 如下所示应返回错误:
#include <iostream>
using namespace std;
// function declaration
void swap(int &x, int &y);
int main () {
// local variable declaration:
int a = 100;
int b = 200;
cout << "Before swap, value of a :" << a << endl;
cout << "Before swap, value of b :" << b << endl;
swap(a, b); //This call MUST NOT be valid.
int &x = a;
int &y = b;
swap(x,y); // This one should be valid.
cout << "After swap, value of a :" << a << endl;
cout << "After swap, value of b :" << b << endl;
return 0;
}
void swap(int &x, int &y) {
int temp;
temp = x; /* save the value at address x */
x = y; /* put y into x */
y = temp; /* put x into y */
return;
}
行swap(a, b)
中的参数按值传递。我希望它在这样做时返回错误。
更新
我在接受采访时被问到这个问题。定义一个在按值调用时返回错误的方法。
与上面swap
中的a
函数一样,b
和<asp:HiddenField ID="HiddenField1" runat="server" EnableViewState="true"/>
中的函数调用必须是引用。
答案 0 :(得分:3)
让
int a{};
int& b{a};
然后你不能以制作
的方式声明或定义函数foo
foo(b);
编译时
foo(a);
无法编译/工作。
如果foo被声明为foo(int& c)
,则在调用foo
时,编译器会将引用c
绑定到对象a
- 无论您是否通过a
或b
,因为引用c
可以绑定到int
类型的任何非常量非易失性左值。
在a
和b
范围内,从C ++开始,两者都是左值,因此对foo
的调用应该没有区别,因为这是引用的内容:它们只是原始对象的某种“命名别名”。
定义函数swap(int&, int&)
已经阻止了“按值调用”。
术语“按值调用”与“按引用调用”是指函数参数的属性,而不是传递对象的属性。