0

考虑以下代码:

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 中,我会假设 - 当在其中调用函数时consumeString-passStringObject变量stringObject只是传递给函数consumeString并且(因为按值调用)调用字符串类的复制构造函数,以便参数 str 是stringObject传递给函数的变量consumeString

但是在第 2 种情况下consumeString调用函数时会发生什么?在调用复制构造函数并将“隐藏”变量的值复制到参数之前,是否隐式调用了字符串类的(重载)赋值运算符(可能将文字分配给后台的某个“隐藏”变量?)str

4

5 回答 5

2

在情况 2 中,std::string(const char*)将在对象传递给之前调用构造函数consumeString,然后将复制临时字符串对象。

于 2014-02-14T11:40:13.047 回答
1

字符串文字产生临时std::string对象。

临时对象的生命周期与创建它的 C++ 指令绑定。

在这种情况下,调用std::string stringObject = "string literal";构造函数const char*来创建一个对象(这不是临时的)。

于 2014-02-14T11:45:05.847 回答
0

在字符串文字的情况下,std::string会创建一个临时对象,然后将其复制到参数中。

于 2014-02-14T11:39:53.563 回答
0

在情况 1 中,您是创建对象的人,当调用该函数时,将调用字符串类的复制构造函数并复制字符串。

在第二种情况下,char *调用参数化构造函数(带参数)来构造字符串对象。

在第 2 种情况下,将在返回后立即调用析构函数字符串类consumeString,在第一种情况下,析构函数将被调用两次,用于consumeString函数中的 tempory 变量,其他用于变量 in passStringObject

于 2014-02-14T11:48:45.480 回答
0

在 case1 中,字符串对象是在本地内存堆中创建的,我们将对象传递给调用。

在 case2 中,字符串对象是在堆栈中创建的,并且该对象被传递给调用函数,返回时它会被自动删除

于 2020-10-21T07:37:23.673 回答