考虑以下代码:
void consumeString(std::string str){
/* some code */
}
void passStringObject(){
std::string stringObject = "string literal";
consumeString(stringObject);
}
void passStringLiteral(){
consumeString("string literal");
}
现在考虑以下两种情况:
1)调用函数passStringObject()
。
2)调用函数passStringLiteral()
。
在第一种情况下,我会假设 - 在consumeString
内调用函数passStringObject
时 - 变量stringObject
只是传递给函数consumeString
而且(因为调用-by-value)调用字符串类的复制构造函数,以便参数str是传递给函数stringObject
的变量consumeString
的副本。
但是在调用函数consumeString
时情况2会发生什么?字符串类的(重载)赋值运算符(可能在背景中将文字分配给某些“隐藏”变量?)在调用复制构造函数之前隐式调用,并将“hidden”变量的值复制到参数{{1 }}?
答案 0 :(得分:2)
在案例2中,在将对象传递给std::string(const char*)
之前将调用consumeString
构造函数,然后将复制临时字符串对象。
答案 1 :(得分:0)
对于字符串文字,创建一个临时std::string
对象,然后将其复制到参数中。
答案 2 :(得分:0)
字符串文字产生临时std::string
个对象。
临时对象的生命周期绑定到创建它的C ++指令。
在std::string stringObject = "string literal";
的情况下,调用来自const char*
的构造函数来创建一个对象(这不是临时的)。
答案 3 :(得分:0)
在案例1中,您是创建对象的人,并且在调用函数时,将调用字符串类的复制构造函数并复制字符串。
在第二种情况下,调用参数化构造函数(带有char *
参数)来构造字符串对象。
在第2种情况下,只要consumeString
返回就会调用析构函数字符串类,并且在第一种情况下,析构函数将在consumeString
函数中被调用两次一次,其他用于passStringObject
中的变量;
答案 4 :(得分:0)
在case1中,字符串对象是在本地内存堆中创建的,然后我们将该对象传递给调用。
在case2中,在堆栈中创建了字符串对象,并将该对象传递给调用函数,返回时该对象将被自动删除