我来自 C 背景并试图理解这意味着什么:
void f(const string &x = "hello") {
}
如果没有传入任何内容,x 是否设置为默认值?“你好”在哪里?
您的参数 ( x
) 在调用函数的上下文中创建/初始化。字符串文字 `"hello" 具有静态存储持续时间。
该标准没有指定存储其中任何一个的内存形式,但在典型情况下,字符串文字将驻留在一些内存中,该内存直接从可执行文件中的数据初始化,并将x
在堆栈上创建(如果您没有在其位置传递其他内容,则使用传递的文字地址来初始化它)。
它被称为默认参数,如果您访问此链接,您将了解它。
默认参数是具有提供给它的默认值的函数参数。如果用户没有为此参数提供值,将使用默认值。如果用户确实为默认参数提供了值,则使用用户提供的值。
所以,如果你f
这样打电话 -
f();
thenx
将包含hello
,但如果你这样称呼它 -
f("test");
然后x
将包含test
.
该参数声明等效于以下更明确的声明
void f(const string &x = string("hello"))
你是对的:在没有显式参数的情况下调用函数时使用=
(所谓的默认参数)之后的部分,如
f();
在这种情况下,类型的临时对象string
是从"hello"
初始化器构造的,然后用作引用的初始化器x
。该临时的构造是在调用代码的上下文中执行的,这意味着上面的调用相当于
f(string("hello"));
要回答您关于"hello"
:的问题,"hello"
它是一个具有静态存储持续时间的字符串文字(即它驻留在静态内存中,就像在 C 中一样)。但同样,请注意,在此示例中,它"hello"
本身不是用作引用的初始值设定项。在这种情况下,编译器将为此目的隐式创建一个短暂的无名临时string
对象,正如我在上面的示例中明确说明的那样。