String(C++ 组件扩展)

Visual c + + 编译器支持字符串,这是表示为一串字符的文本的对象。Visual c + + 支持字符串变量,其值是隐式的并且文本,其值是显式的带引号的字符串。

所有的运行库

运行 Windows 时,公共语言运行时为其分配的内存自动管理的对象中表示字符串。即,您不需要显式放弃的内存的字符串,字符串变量超出范围或应用程序结束时。要指示字符串对象的生存期自动管理,声明将字符串类型与句柄的对象 (^) 修饰符。

运行 Windows 时

Windows 运行库体系结构需要实现的 Visual c + + String数据类型在Platform命名空间。为方便起见,Visual c + + 还提供了string数据类型,即是同义词Platform::String,请在default命名空间。

ms177218.collapse_all(zh-cn,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-cn,VS.110).gif备注

有关详细信息和有关字符串的示例,请参阅平台:: 字符串, std:: wstring 和文本 (平台)

ms177218.collapse_all(zh-cn,VS.110).gif要求

编译器选项:/ZW

公共语言运行时

本主题讨论使用运行它时,Visual c + + 编译器如何处理字符串**/clr编译器选项。若要使用/clr**,您还必须使用公共语言运行库 (CLR),C + + / CLI 的语法和管理的对象。有关 /clr的更多信息,请参见/clr(公共语言运行时编译)

与编译时**/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-cn,VS.110).gif要求

编译器选项:/clr

ms177218.collapse_all(zh-cn,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(公共语言运行时编译)

概念

适用于运行时平台的组件扩展