2013-03-20 94 views
3

我是Visual C++編程中的一個完整的noob,所以我不知道這是否合理。System :: Convert :: ToString()和std :: to_string()之間的區別?

好吧,我試圖改變標籤文字的形式來顯示,因此,如果我這樣做:

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(); 

之間????

+1

在這兩種情況下,一個是C++/CLI,一個是標準C++。差異是可以預料的。 – chris 2013-03-20 20:21:19

+0

查看文檔可以回答這個問題 - 類型不匹配! – 2013-03-20 20:26:33

回答

3

System::String^ j;是一個C++/CLI字符串,它是Microsoft在.NET框架之上的C++實現,因此您可以使用.NET語言(C#,VB.NET)進行通信並仍然使用C++。 ^是C++/CLI使用的垃圾收集指針。這意味着在使用gcnew

std::string是C++標準庫的字符串版本時,您不必關心自己清理後的情況。它的原生C++有些人可能稱它爲

在C++中,每次使用帶指針的new,yuck都不會忘記調用delete

System::Convert::ToString也是來自Microsoft的C++/CLI。

std::to_string將是C++ 11的等價物。

實現有很大的不同,所以你不能指望用這些不同的類型得到相同的結果。

+0

好的,非常感謝! – 2013-03-20 20:42:33

0

您的困惑之源可能是您正在使用C++/CLI,因此您可以訪問許多不同的字符串類型。開發C++/CLI可以讓你訪問兩個世界:

  1. 非託管:這基本上是本地的標準C++代碼。雖然C++/CLI不符合C++標準,但它確實允許您混合使用C++代碼:您可以使用大多數C++庫(通過「它只是工作範例」)。此代碼被稱爲「非託管」,因爲您必須執行自己的內存管理。
  2. 託管:這是事物的.NET方面。使用.net類,您可以訪問微軟推出的有用庫,並且可以使用垃圾收集器。

System :: String是託管.NET字符串類型。這是所有.NET語言使用的字符串類型(C#,VBA,ect)。這是一個只能使用C++/CLI &的類。淨。如果您正在編寫純Windows代碼,或者如果想要編寫.NET庫,請使用此類型。在這些語言中,「to string」函數實際上是所有類的成員,並且該投射通常是隱含的。您可以使用

j = valor1+","+valor2; 

如果你想獲得明確的,窺視詮釋:: ToString函數:

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

的std :: string是不受控,STL字符串。這是標準的C++類,可用於C++和C++/CLI。如果您想將其與其他.NET類一起使用,則必須編組此類。如果您試圖完全保留在非託管代碼中,請使用此類。

如果您正在嘗試學習C++,我建議現在關閉C++/CLI,並堅持使用標準庫字符串。

+0

我明白了,但Visual Studio窗體標籤的text屬性似乎只接受Managed字符串...有沒有辦法從一個到另一個? – 2013-03-21 02:04:00

+1

我有這個方便查找表的書籤:[http://msdn.microsoft.com/en-us/library/vstudio/bb384865.aspx] – IdeaHat 2013-03-21 15:24:14

相關問題