在函数参数中分配/初始化引用
Assigning/Initializing references in function args
我来自C背景,正试图理解这意味着什么:
void f(const string &x = "hello") {
}
如果没有传入任何内容,x是否设置为默认值?"你好"住在哪里?
您的参数(x
)是在调用函数的上下文中创建/初始化的。字符串文字"hello"具有静态存储持续时间。
该标准没有指定存储这两种类型的内存的形式,但在典型情况下,字符串文字将驻留在一些直接从可执行文件中的数据初始化的内存中,并且x
将在堆栈上创建(如果不在其位置传递其他内容,则传递文字的地址来初始化它)。
它被称为默认参数,如果您访问此链接,您将了解这些参数。
默认参数是具有默认值的函数参数提供给它。如果用户没有为此提供值参数,将使用默认值。如果用户提供值,则使用用户提供的值。
所以,如果你这样调用f
-
f();
那么x
将包含hello
,但如果你这样称呼它-
f("test");
则CCD_ 6将包含CCD_。
该参数声明等效于以下更明确的一个
void f(const string &x = string("hello"))
您是正确的:当函数在没有显式参数的情况下调用时,会使用=
之后的部分(即所谓的默认参数),如中
f();
在这种情况下,string
类型的临时对象由"hello"
初始化器构造,然后用作引用x
的初始化器。该临时调用的构造是在调用代码的上下文中执行的,这意味着上述调用等效于
f(string("hello"));
为了回答您关于"hello"
的问题:"hello"
是一个具有静态存储持续时间的字符串文字(即,它驻留在静态内存中,就像在C中一样)。但是,请再次注意,在本例中,并不是"hello"
本身用作引用的初始值设定项。在这种情况下,编译器将隐式地为此目的创建一个短暂的无名称临时string
对象,正如我在上面的示例中明确指出的那样。
相关文章:
- C++在构造函数处用表达式初始化引用
- 我可以从取消引用"new"的返回值初始化引用吗
- 通过用户定义的转换初始化引用
- 为什么我可以在初始化引用后重新绑定引用?
- TBB 编译器错误 -"my_task":必须初始化引用
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为构造函数初始化引用实例变量提供默认值
- 在构造过程中获取类成员的未初始化引用是否合法
- 在C++中初始化引用
- 在动态分配的结构中初始化引用
- 使用三元运算符初始化引用变量
- 如何在 c++ 中显式初始化引用
- 初始化引用时何时以及为何获得副本
- 初始化C++引用-为什么不使用运算符的地址
- 在C++中初始化引用和变量
- 在函数参数中分配/初始化引用
- 在 C++ 中初始化引用不起作用,但初始化 const 引用有效,为什么?
- 类组合构造函数 d 必须显式初始化引用成员
- 用对tuple的引用初始化引用的元组
- 为什么在c++中不能重新初始化引用