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