可能重复:
C++ functions: ampersand vs asterisk
What are the distinctions between the various symbols (*,&, etc) combined with parameters?
我想知道C ++函数调用中地址运算符&
和deference运算符*
之间的区别。例如,采取以下功能
void foo (std::string& param)
{
param = "Bar.";
std::cout << param.size();
}
让我们在我们的main()
函数中调用它...
int main()
{
std::string test;
foo(test); //Why not foo(&test)?
std::cout << test; //Prints out the value "Bar."
}
首先,为什么&
运算符允许我分配一个值,就好像它是一个指针一样(为它赋值一个幸存RAII的值和函数foo()
的范围,当它不是指针),因为它可以打印在我的main()
函数中,即使它不是static
?我假设它不是指针,因为我能够使用size()
运算符而不是用于指针的.
来访问->
方法。
其次,在函数参数中使用&
运算符与使用*
运算符之间的区别是什么?它甚至不仅仅是像std::string param
这样的普通变量吗?它似乎被称为(foo(test)
而不是foo(&test)
)。
答案 0 :(得分:4)
&
函数参数具体表示此参数是由引用传入的(传统编译器将其实现为指针),这就是为什么您在此处看到此赋值的效果main()
。
static
与此无关。
使用&
和*
向函数声明参数的区别在于,第二个允许nullptr
(或者不存在或只是一个普通的无效地址)传入,而&
保证此函数的参数引用了一个真实对象。除此之外,两者都提供类似的功能,允许通过它的参考来改变原始对象。
答案 1 :(得分:0)
test
自己(没有&
)会将副本传递给字符串到函数,而&
表示它会传递引用。
仅供参考:当您不需要引用时,最佳实践要求将所有对象作为const引用传递。