3

我来自 C 背景并试图理解这意味着什么:

void f(const string &x = "hello") {
}

如果没有传入任何内容,x 是否设置为默认值?“你好”在哪里?

4

3 回答 3

6

您的参数 ( x) 在调用函数的上下文中创建/初始化。字符串文字 `"hello" 具有静态存储持续时间。

该标准没有指定存储其中任何一个的内存形式,但在典型情况下,字符串文字将驻留在一些内存中,该内存直接从可执行文件中的数据初始化,并将x在堆栈上创建(如果您没有在其位置传递其他内容,则使用传递的文字地址来初始化它)。

于 2013-08-19T06:15:06.920 回答
2

它被称为默认参数,如果您访问此链接,您将了解它。

默认参数是具有提供给它的默认值的函数参数。如果用户没有为此参数提供值,将使用默认值。如果用户确实为默认参数提供了值,则使用用户提供的值。

所以,如果你f这样打电话 -

f();

thenx将包含hello,但如果你这样称呼它 -

f("test");

然后x将包含test.

于 2013-08-19T06:08:56.537 回答
0

该参数声明等效于以下更明确的声明

void f(const string &x = string("hello")) 

你是对的:在没有显式参数的情况下调用函数时使用=(所谓的默认参数)之后的部分,如

f();

在这种情况下,类型的临时对象string是从"hello"初始化器构造的,然后用作引用的初始化器x。该临时的构造是在调用代码的上下文中执行的,这意味着上面的调用相当于

f(string("hello"));

要回答您关于"hello":的问题,"hello"它是一个具有静态存储持续时间的字符串文字(即它驻留在静态内存中,就像在 C 中一样)。但同样,请注意,在此示例中,它"hello"本身不是用作引用的初始值设定项。在这种情况下,编译器将为此目的隐式创建一个短暂的无名临时string对象,正如我在上面的示例中明确说明的那样。

于 2013-08-19T06:39:46.780 回答