3

我完全是 Visual C++ 编程的菜鸟,所以我不知道这是否有意义。

好吧,我正在尝试更改标签文本以显示在表单中,所以如果我这样做:

int value_a = 1;
int value_b = 2;
System::String^ j;
j = System::Convert::ToString(value_a) + ", " + System::Convert::ToString(value_b);
label1 -> Text = j;

它工作得很好,但是当我尝试这样做时:

int value_a = 1;
int value_b = 2;
System::String^ j;
j = std::to_string(valor1) + ", " + std::to_string(valor2);
label1-> Text = j;

我得到很多错误......使用有什么区别

string j;

或者

System::String^ j;

和功能之间

System::Convert::ToString();

std::to_string();

???

4

2 回答 2

3

System::String^ j;是一个 C++/CLI 字符串,它是 Microsoft 在 .NET 框架之上的 C++ 实现,因此您可以通过它与 .NET 语言(C#、VB.NET)进行通信,并且仍然使用 C++。这^是 C++/CLI 使用的垃圾回收指针。这意味着您不必关心使用后自己清理gcnew

std::string是 C++ 标准库的字符串版本。它是本机 C++,有些人可能会这样称呼它。

在 C++ 中,每次使用new指针时,都不能忘记调用delete.

System::Convert::ToString也是来自微软的 C++/CLI。

std::to_string将是 C++11 的等价物。

实现是完全不同的,所以你不能期望用这些不同的类型得到相同的结果。

于 2013-03-20T20:40:16.047 回答
0

您感到困惑的原因可能是您使用的是 C++/CLI,因此您可以访问许多不同的字符串类型。开发 C++/CLI 是为了让您访问两个世界:

  1. 非托管:这基本上是本机的标准 C++ 代码。虽然 C++/CLI 绝不符合 C++ 标准,但它确实允许您混合 C++ 代码:您可以使用大多数 C++ 库(通过“它只是工作范例”)。此代码称为“非托管”,因为您必须自己进行内存管理。
  2. 托管:这是 .NET 方面的事情。使用 .net 类,您可以访问 microsoft 推出的有用库,并且可以使用垃圾收集器。

System::String 是托管的 .NET 字符串类型。这是所有 .NET 语言(C#、VBA 等)都使用的字符串类型。这是一个只能与 C++/CLI 和 .NET 一起使用的类。如果您正在编写纯 Windows 代码,或者想要编写 .NET 库,请使用此类型。在这些语言中,“to string”函数实际上是所有类的成员,并且转换通常是隐式的。您可以使用

j = valor1+","+valor2;

如果要明确,请查看 Int::ToString 函数:

System::String^ j= Int32(1).ToString();

std::string 是非托管的 stl 字符串。这是标准 C++ 类,可用于 C++ 和 C++/CLI。如果要将其与其他 .NET 类一起使用,则必须编组该类。如果您试图完全停留在非托管代码中,请使用此类。

如果您正在尝试学习 C++,我建议您暂时关闭 C++/CLI,并坚持使用标准库字符串。

于 2013-03-20T20:41:04.767 回答