如何将字符串文字传递给在C ++中处理的函数?

时间:2014-02-14 11:37:08

标签: 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)调用函数passStringObject()

2)调用函数passStringLiteral()

在第一种情况下,我会假设 - 在consumeString内调用函数passStringObject时 - 变量stringObject只是传递给函数consumeString而且(因为调用-by-value)调用字符串类的复制构造函数,以便参数str是传递给函数stringObject的变量consumeString的副本。

但是在调用函数consumeString时情况2会发生什么?字符串类的(重载)赋值运算符(可能在背景中将文字分配给某些“隐藏”变量?)在调用复制构造函数之前隐式调用,并将“hidden”变量的值复制到参数{{1 }}?

5 个答案:

答案 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中,在堆栈中创建了字符串对象,并将该对象传递给调用函数,返回时该对象将被自动删除