C++ 如何将字符串文本传递给C++;?
考虑以下代码:C++ 如何将字符串文本传递给C++;?,c++,string,call-by-value,C++,String,Call By Value,考虑以下代码: void consumeString(std::string str){ /* some code */ } void passStringObject(){ std::string stringObject = "string literal"; consumeString(stringObject); } void passStringLiteral(){ consumeString("string literal"); } 现在考虑以下两种情况: 1)
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()
在案例1中,我假设-在调用passStringObject
中的函数consumeString
时,-变量stringObject
刚刚传递给函数consumeString
,并且(由于按值调用)调用string类的复制构造函数,以便参数str是传递给函数consumeString
的变量stringObject
的副本
但是当调用函数
consumeString
时,情况2中会发生什么?在调用复制构造函数并将“隐藏”变量的值复制到参数str
?之前,是否隐式调用了string类的(重载)赋值运算符(可能将文本分配给后台的某个“隐藏”变量?),创建一个临时的std::string
对象,然后将其复制到参数中。在案例2中,将在对象传递到consumeString
之前调用std::string(const char*)
构造函数,然后将复制临时字符串对象。字符串文本生成临时std::string
对象
临时对象的生存期与创建它的C++指令绑定。< /P>
在
std::string stringObject=“string literal”的情况下
调用const char*
中的构造函数来创建对象(这不是临时的)。在案例1中,您是创建对象的人,当调用函数时,将调用string类的复制构造函数并复制字符串
在第二种情况下,调用参数化构造函数(使用char*
参数)来构造字符串对象
在情况2中,
consumeString
返回时,将立即调用析构函数string类,在第一种情况下,consumeString
函数中的临时变量和passStringObject
中的其他变量将调用析构函数两次 在案例1中,字符串对象在本地内存堆中创建,我们将该对象传递给调用方
在案例2中,字符串对象在堆栈中创建,并将该对象传递给调用函数,返回时自动删除它将创建一个临时的
std::string
实例并在案例2中使用