【问题标题】:How is passing a string literal to a function handled in C++?如何将字符串文字传递给用 C++ 处理的函数?
【发布时间】:2014-02-14 11:37:08
【问题描述】:

考虑以下代码:

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 是变量 stringObject 的副本,该变量已传递给函数 consumeString

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

【问题讨论】:

  • 将创建一个临时的std::string 实例并在情况2中使用

标签: c++ string call-by-value


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    字符串字面量生成临时的 std::string 对象。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        在情况 2 中,只要consumeString 返回,就会调用析构函数字符串类,在第一种情况下,析构函数将被调用两次,用于consumeString 函数中的临时变量和@987654324 中的变量@;

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-05
            • 2014-03-19
            • 2013-05-21
            • 2015-09-09
            相关资源
            最近更新 更多