【问题标题】:what is the scope of this variable in c++?这个变量在 C++ 中的作用域是什么?
【发布时间】:2020-05-30 01:12:19
【问题描述】:

如果我定义这样的函数

std::string& returnstring(std::istringstream &ist)
{
    std::string temp;
    std::getline(ist,temp);
    return temp;
}

如果我使用这个temp,它通过引用传递给像这样的另一个函数

void displaystring(std::string &temp)
{
    std::cout<<temp;
}

当我通过引用displaystring 函数传递string temp 时,它是否仍在范围内?

【问题讨论】:

  • 不,你会有一个悬空引用
  • 好的。那么传值呢?
  • 是的,按值传递。 RVO 将确保它不会被复制。你可以相信编译器会在这里做正确的事情
  • 您似乎将scopelifetime 混淆了
  • 谢谢@Wbuck。是的,克里斯,我正在尝试了解两者之间的区别

标签: c++ scope


【解决方案1】:

变量的作用域是它被声明的作用域。 std::string temp; 在函数returnstring 的主体中声明,因此该函数主体是变量的范围。它是一个自动变量,因此它的生命周期在其作用域结束时结束并被自动销毁。

返回的引用将是无效的(即它是一个悬空引用)。如果你试图通过无效引用访问不存在的对象,那么程序的行为将是不确定的。

要修复函数,一个简单的解决方案是返回一个值。

【讨论】:

    【解决方案2】:

    不,因为 temp 变量是 returnstring 函数的本地变量,一旦代码超出了 retuernstring 函数,temp 变量就不再有效。 如果您想发送参考并获得答案,那么更好的选择是通过参考发送参数,如下所示,

    void copyLineAsString(std::istringstream &ist, std::string& tempString)
    {
        std::getline(ist,tempString);
        return;
    }
    

    对于良好的编码实践,我对您的代码几乎没有其他建议, 切勿使用“&”作为返回类型/通过引用返回变量。函数名称使用驼峰式大小写或 _ 分隔符(例如 returnString 或 return_string)。

    【讨论】:

      【解决方案3】:

      没有。 temp 的范围仅限于声明它的块。因为您在堆栈上声明了它(您没有使用关键字new),所以变量 temp 将在您退出函数的那一刻被销毁。 保留变量的唯一方法是将 temp 的值复制到函数外部的变量中。例如,这会起作用:

      std::string returnstring(std::istringstream &ist)
      {
          std::string temp;
          std::getline(ist,temp);
          return temp;
      }
      

      因为返回值是一个副本而不是一个引用,你可以这样做 std::string 返回字符串 = returnstring(ist); 并将 temp 的值复制到一个新声明的变量中,该变量可用于您的 displaystring 函数。

      一般来说,我会避免在函数范围内声明您在函数范围之外需要的变量。相反,只要您返回函数内部构建的变量,就按值返回(但不建议用于大型数组和对象)。

      【讨论】:

        【解决方案4】:

        this 是引用变量,它引用当前调用它的类对象。它仅在类内部具有作用域,并且与调用它的对象的生命周期相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-06
          相关资源
          最近更新 更多