在 & 和 * 之间通过引用传递时有什么区别?
What is the difference when passing by reference between & and *?
在声明函数时,参数string*
和string&
的区别是什么?我知道string s
会复制字符串s并按值传递它,但似乎在许多网站上,他们将string* s
和string& s
称为引用传递。我是c++的新手,这是唯一一件我自己没能弄清楚的事情。提前感谢:)
这里有一个很好的解释:
http://www.cprogramming.com/tutorial/references.html(提示:不只是"看起来不一样")
通过指针string* s
传递一个地址,因此s
不是string
类型,它是一个地址。如果对它解引用,即使用包括*s
在内的某些表达式,则*s
为字符串类型。
通过引用string& s
传递时,s
是字符串类型,因此不需要解引用。
很多几乎正确的答案。许多是适合特定实现的,但依赖于编译器部分未指定的行为。
除了.
vs ->
:
- 指针是第一类对象,而引用不是。你可以获取指针的地址,但不能获取引用的地址(你将获得被引用对象的地址)
- 引用在其生命周期内总是引用同一个对象。非const指针可以改变。
- 引用不能指向"空对象"。你可以编写这样的代码,但你依赖于未指定的编译器行为
- 你可以在指针上做算术操作
一般来说,语言规范很少提到引用,故意给编译器作者很大的实现空间。它们的操作方式很像const指针,这一事实并没有得到规范的保证。
我发现指针参数在两个方面非常有用:
- 调用者必须传递一个指针,该指针很可能是自动变量的地址。这使得读取调用代码的人很明显,传递地址的变量可能会改变。
- 指针可以有一个NULL值,它就像一个哨兵。引用不能做到这一点。例如,在你自己的字符串&与string *相比,空字符串可能是变量的可接受值,因此作为哨兵是无用的。但是,指针形参的NULL值告诉函数调用者没有设置字符串*参数。接收字符串&无法确定调用方是否未设置该值,还是满足于默认初始值。
主要区别在于如何调用函数。考虑这些例子:
void f(string *s)
{}
int main() {
string s;
f(&s);
}
和参考版本:
void f(string &s) { }
int main() {
string s;
f(s);
}
所以函数调用看起来不同…
"
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?