函数调用中 * 和 & 运算符之间的区别
Difference between the * and & operator in function calls
可能重复:
C++函数:符号与星号
与参数组合的各种符号(*、&等)之间有什么区别?
我想知道C++函数调用中的地址运算符&
和尊重运算符*
之间的区别。例如,以以下函数为例
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."
}
首先,为什么&
运算符允许我像指针一样分配一个值(当它不是指针时,为它分配一个在函数foo()
的RAII和作用域中幸存的值),因为它可以在我的main()
函数中打印出来,即使它不是static
?我假设它不是指针,因为我能够通过使用.
运算符而不是用于指针的->
来访问size()
方法。
其次,在函数参数中使用&
运算符与使用*
运算符有什么区别?它甚至不同于像std::string param
这样的普通变量吗?它似乎是这样调用的(foo(test)
而不是foo(&test)
)。
&
函数参数专门表示此参数由引用传入(传统编译器将其作为指针实现),这就是为什么您在main()
中看到此赋值的效果。static
与此无关。
使用&
和*
向函数声明参数的区别在于,第二种方法允许传入nullptr
(或不存在或只是一个明显无效的地址),而&
则保证该函数的参数引用了一个真实对象。除此之外,两者都提供了类似的功能,允许通过引用更改原始对象。
test
本身(没有&
)将向函数传递字符串的副本,而&
意味着它将传递引用。
仅供参考:当您不需要引用时,最佳实践要求将所有对象作为常量引用传递。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?