共用方式為


字串 (C++ 元件擴充功能)

Visual C++ 編譯器支援字串,何者是代表一連串字元為文字的物件。 Visual C++ 支援字串變數,其值是隱含的和常值,其值是外顯括住的字串。

所有的執行階段

Windows 執行階段和公用語言執行時間來代表字串物件會自動管理其配置的記憶體。 也就是您不需要明確地在字串變數超出範圍或您的應用程式結束時捨棄字串的記憶體。 若要表示的字串物件存留期自動管理,宣告 string 型別與的控制代碼物件 (^) 修飾詞。

Windows 執行階段

Windows 執行階段架構需要實作的 Visual C++ String中的資料型別Platform命名空間。 為了方便起見,Visual C++ 也會提供string的資料型別,這是個同義資料表Platform::String,請在default命名空間。

ms177218.collapse_all(zh-tw,VS.110).gif語法

// compile with /ZW
using namespace Platform;
using namespace default;
   Platform::String^ MyString1 = "The quick brown fox";
   String^ MyString2 = "jumped over the lazy dog.";
   String^ MyString3 = "Hello, world!";

ms177218.collapse_all(zh-tw,VS.110).gif備註

如需詳細資訊以及有關字串的範例,請參閱Platform::String、 std::wstring 和常值 (平台)

ms177218.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/ZW

Common Language Runtime

本主題將討論 Visual C++ 編譯器如何處理字串常值,當您藉由執行**/clr編譯器選項。 若要使用/clr**,您必須亦使用 common language runtime (CLR),C + + /cli 語法和 managed 物件。 如需 /clr 的詳細資訊,請參閱 /clr (Common Language Runtime 編譯)

編譯與時**/clr**,編譯器會將字串常值轉換為字串型別的String。 若要保留與現有的程式碼有回溯相容性是兩個例外:

  • 例外處理。 擲回的字串常值時,編譯器會攔截它做為字串常值。

  • 範本推算。 當字串常值當作樣板引數傳遞時,編譯器不會將轉換以String。 請注意,做為泛型引數傳遞的字串常值中將會升級成String

編譯器也有內建支援,您可以覆寫來自訂其行為的三個運算子:

  • System::String ^ 運算子 + System::String (System::String)。

  • System::String ^ 運算子 + (System::Object System::String)。

  • System::String ^ 運算子 + (System::String System::Object)。

當傳遞String,編譯器會] 方塊中,如有必要,然後串連字串的物件 (使用 ToString)。

編譯與時**/clr:oldSyntax**,字串常值將不會被轉換成String

注意事項注意事項

插入號 ("^") 表示宣告的變數是 C + + 的控制碼 /cli CLI 管理物件。

如需詳細資訊,請參閱C + + 字串常值

ms177218.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

ms177218.collapse_all(zh-tw,VS.110).gif範例

範例

下列程式碼範例示範串連和比較字串。

// string_operators.cpp
// compile with: /clr
// In the following code, the caret ("^") indicates that the 
// declared variable is a handle to a C++/CLI managed object.
using namespace System;

int main() {
   String ^ a = gcnew String("abc");
   String ^ b = "def";   // same as gcnew form
   Object ^ c = gcnew String("ghi");

   char d[100] = "abc";

   // variables of System::String returning a System::String
   Console::WriteLine(a + b);
   Console::WriteLine(a + c);
   Console::WriteLine(c + a);

   // accessing a character in the string
   Console::WriteLine(a[2]);

   // concatenation of three System::Strings
   Console::WriteLine(a + b + c);

   // concatenation of a System::String and string literal
   Console::WriteLine(a + "zzz");

   // you can append to a System::String ^
   Console::WriteLine(a + 1);
   Console::WriteLine(a + 'a');
   Console::WriteLine(a + 3.1);

   // test System::String ^ for equality
   a += b;
   Console::WriteLine(a);
   a = b;
   if (a == b)
      Console::WriteLine("a and b are equal");

   a = "abc";
   if (a != b)
      Console::WriteLine("a and b are not equal");

   // System:String ^ and tracking reference
   String^% rstr1 = a;
   Console::WriteLine(rstr1);

   // testing an empty System::String ^
   String ^ n;
   if (n == nullptr)
      Console::WriteLine("n is empty");
}

Output

  
  
  
  
  
  
  
  
  
  
  
  
  
  

範例

下列範例顯示可多載的編譯器所提供的運算子,而且編譯器將某個函式多載根據String型別。

// string_operators_2.cpp
// compile with: /clr
using namespace System;

// a string^ overload will be favored when calling with a String
void Test_Overload(const char * a) { 
   Console::WriteLine("const char * a"); 
}
void Test_Overload(String ^ a) { 
   Console::WriteLine("String ^ a"); 
}

// overload will be called instead of compiler defined operator
String ^ operator +(String ^ a, String ^ b) {
   return ("overloaded +(String ^ a, String ^ b)");
}

// overload will be called instead of compiler defined operator
String ^ operator +(Object ^ a, String ^ b) {
   return ("overloaded +(Object ^ a, String ^ b)");
}

// overload will be called instead of compiler defined operator
String ^ operator +(String ^ a, Object ^ b) {
   return ("overloaded +(String ^ a, Object ^ b)");
}

int main() {
   String ^ a = gcnew String("abc");
   String ^ b = "def";   // same as gcnew form
   Object ^ c = gcnew String("ghi");

   char d[100] = "abc";

   Console::WriteLine(a + b);
   Console::WriteLine(a + c);
   Console::WriteLine(c + a);

   Test_Overload("hello");
   Test_Overload(d);
}

Output

  
  
  
  
  

範例

下列範例會示範編譯器會區別原生字串和String的字串。

// string_operators_3.cpp
// compile with: /clr
using namespace System;
int func() {
   throw "simple string";   // const char *
};

int func2() {
   throw "string" + "string";   // returns System::String
};

template<typename T>
void func3(T t) {
   Console::WriteLine(T::typeid);
}

int main() {
   try {
      func();
   }
   catch(char * e) {
      Console::WriteLine("char *");
   }

   try {
      func2();
   }
   catch(String^ str) {
      Console::WriteLine("String^ str");
   }

   func3("string");   // const char *
   func3("string" + "string");   // returns System::String
}

Output

  
  
  
  

請參閱

參考

C + + 字串常值

/clr (Common Language Runtime 編譯)

概念

執行階段平台的元件擴充功能