String (расширения компонентов C++)

Компилятор Visual C++ поддерживает строки, являющиеся объектами, которые представляют текст как последовательность символов. Visual C++ поддерживает строковые переменные, значения которых являются неявными, и литералы, значением которых является явная строка в кавычках.

Все среды выполнения

Среда выполнения Windows и среда CLR представляют строки как объекты, чья выделяемая память управляется автоматически. Это значит, что не требуется явно отменять память для строки, если переменная выходит за пределы области видимости или приложение завершается. Чтобы указать, что время существования объекта строки должно управляться автоматически, объявите тип string с помощью модификатора дескриптор-объекта (^).

среда выполнения Windows

Архитектура среды выполнения Windows требует Visual C++ реализовывать тип данных String в пространстве имен Platform. Для удобства Visual C++ также предоставляет тип данных string, синоним для Platform::String в пространстве имен default.

Синтаксис

// 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!";

Примечания

Дополнительные сведения и примеры со строками см. в разделе платформа:: строка, std:: wstring и литералы (платформы).

Требования

Параметр компилятора: /ZW

Среда CLR

В этом разделе рассматривается, как компилятор Visual C++ обрабатывает строковые литералы при запуске с помощью параметра компилятора /clr. Для использования /clr, необходимо использовать среду CLR, синтаксис C++/CLI и управляемые объекты. Дополнительные сведения о /clr см. в разделе /clr (компиляция CLR).

При компилировании с /clr, компилятор преобразует строковые литералы в строки типа String. Для сохранения обратной совместимости с существующим кодом есть два исключения:

  • Обработка исключений. Если возникает строковый литерал, компилятор будет перехватывать его как строковый литерал.

  • Вывод шаблона. Если строковый литерал передается в качестве аргумента шаблона, компилятор не преобразует его в String. Обратите внимание, что строковые литералы, переданные как универсальный аргумент, будут повышены до String.

Компилятор также имеет встроенную поддержку трех операторов, которые можно переопределить для изменения их поведения.

  • System::String ^ operator +( System::String, System::String);

  • System::String ^ operator +( System::Object, System::String);

  • System::String ^ operator +( System::String, System::Object);

После передачи String, компилятор будет упаковывать, если необходимо, а затем сцеплять объект (с ToString) со строкой.

При компилировании с /clr:oldSyntax, строковые литералы не будут преобразованы в String.

Примечание

Курсор ("^") означает, что объявленная переменная является дескриптором управляемого объекта C++/CLI.

Дополнительные сведения см. в разделе Строковые литералы в C++.

Требования

Параметр компилятора: /clr

Примеры

Пример

В следующем примере кода демонстрируется сцепление и сравнение строк.

// 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 (компиляция CLR)

Основные понятия

Расширения компонентов для платформ среды выполнения