【问题标题】:String return from member function in C++从 C++ 中的成员函数返回字符串
【发布时间】:2015-01-13 00:42:45
【问题描述】:

我是一名 c 程序员,刚刚开始使用 c++。在 c 中,如果我们从函数返回地址,那么我们传递的地址将是无效的,除非我们动态分配了该内存。 但是在 C++ 中,我没有分配内存来存储字符串。 即使从函数 copy_string 返回后,字符串“a”的地址是否仍然有效。 为什么在 main 函数中它返回正确的字符串?

#include <iostream>
#include <string>

using namespace std;

class String_copy{
public:
        string str1;
        string str2;
        string copy_string(string str);
  };

  string String_copy::copy_string(string str)
  {
          string a;
          string b;

          b="Hello World!";

          a = str+" "+b;
          return a;
  }

  int main(void)
  {
    String_copy str;
    str.str1="Wooo";
    str.str2 = str.copy_string(str.str1);
    cout << "Final string is \"" << str.str2 << "\"" << endl;
    return 0;
  }

【问题讨论】:

  • string 不是 char *
  • 您需要复习您的C 知识。 C 与您在此处的代码中看到的行为相同。想象string 是 C 中的一个结构,当你按值返回结构时会发生什么?
  • 在此处查看此 C 示例:ideone.com/VJ1sH4 您将看到结构被复制,与被复制的字符串对象没有什么不同。不同之处在于,C++ 允许您通过使该函数可用(通过复制构造函数和赋值操作)来“微调”复制的制作方式。
  • 感谢 Paul 的解释。我假设字符串在 c++ 中被视为 char * ,但它只是一个值而不是指针。 :D

标签: c++ compilation


【解决方案1】:

在 C 和 C++ 中,与 C# 和 Java 不同,变量不需要在动态内存中分配,包括字符串和字符数组。

如果您需要想要从函数返回指针,它们必须指向某个在执行离开函数后不会消失的变量。两种流行的技术是使用static 变量或从动态内存分配的变量。 static 和动态分配的变量都将在执行离开函数后出现。

您可能会将std::string 与C 样式字符数组混淆。 std::string 类是一个对象,可以从整数或双精度等函数返回。

从技术上讲,可以不使用指针从函数返回 C 样式字符串。很像返回一个整数数组。

C 中的常见做法是返回指向数组的指针,以避免复制大型数据结构。所以约定是返回一个指向 C-Style 字符串的指针,并且目标必须是 static 或动态分配的,因此指针的目标在执行离开函数后不会消失。

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2018-06-22
    • 2013-10-13
    相关资源
    最近更新 更多