SlideShare a Scribd company logo
C++/CLI:
ОСОБЕННОСТИ ЯЗЫКА
Михаил Кройтор
Оглавление
 Работа с массивами
 Строки
 Родовые типы и шаблоны
 Смешение управляемого и неуправляемого
кодов
array – управляемый (многомерный) массив
фиксированного размера
ArrayList – динамический массив, совпадающий по
функциональности со списком.
List – управляемый список
Работа с массивами
Работа с массивами:
инициализация
 Объявление управляемых массивов похожа на
инстанциирование шаблонов:
array<int>^ a0;
array<int, 5>^ a0; // 5 – размерность массива
 Размеры массива указываются при
инициализации:
array<int>^ a1 = gcnew array<int>(6) {1, 2, 3, 4, 5, 6};
array<int>^ a2 = gcnew array<int> {1, 2, 3, 4, 5, 6};
array<int>^ a3 = {1, 2, 3, 4, 5, 6};
array<Double, 2>^ b0 = gcnew array<Double, 2> (3, 2);
В инициализаторе можно
использовать переменные.
Работа с массивами:
перебор элементов
 обычный перебор, при помощи цикла for
for(i = 0; i < a1->Length; i++)
{
Console::Write("{0} ", a1[i]);
}
 Использование конструкции for each
for each(Int32^ value in a2)
{
Console::Write("{0} ", value);
}
Работа с массивами:
копирование и сравнение массивов
 При помощи методов класса:
 Clone() – для поверхностного копирования
(создание нового дескриптора на тот же участок
памяти)
 Copy() – для глубокого копирования (создание
нового объекта в управляемой памяти)
 Equals() , как и оператор сравнения, проверяет
на равенство только дескрипторы
Работа с массивами:
ArrayList
 Объявлен в пространстве имён Collections
Collections::ArrayList^ a = gcnew Collections::ArrayList;
 Не осуществляет контроль типов
a->Add(10);
a->Add("test");
a->Add(gcnew Object);
 Для поддержки контроля типов рекомендуются
родовые классы, например List
родовым классом называются классы,
поддерживающие параметризацию
во время выполнения
Работа с массивами:
родовой класс List
using namespace System:: Collections::Generic;
List<Int32>^ l = gcnew List<Int32>();
l->Add(10);
l->Add(21);
Создание строк
Форматирование строк
Конвертирование строк
Строки
Строки
 Тип String представляет собой ссылочный тип,
содержащий в себе последовательность
символов Unicode, и предназначен для работы
со строками.
 Класс String представляет собой неизменяемую
последовательность.
 Для работы со строкой, изменяемой в рамках
одной последовательности, используется
StringBuilder.
Работа со строками
String^ str1 = gcnew String("test");
String^ str2 = " string";
String^ str3 = String::Concat(str1, str2);
Console::WriteLine("{0}[3] = {1}",
str3, str3->Chars[3]);
if (str1->Equals(str2)) Console::WriteLine("str1 equals
str2");
else Console::WriteLine("str1 NOT equals str2");
if (str3 == str2)Console::WriteLine("str3 equals str2");
else Console::WriteLine("str3 NOT equals str2");
if (String::ReferenceEquals(str1, str2))
Console::WriteLine("ref str1 equals ref str2");
else Console::WriteLine("ref str1 NOT equals ref str2");
оператор сравнения, как и метод
Equals, проверяют на равенство
значения строк.
Работа со строками
 Оператор присваивания создает еще одну
ссылку на тот же объект, метод Copy создает
новый объект.
Работа со строками: форматирование
 Для создания отформатированных строк используется
метод Format.
 Форматирование строк определяется форматирующей
строкой, содержащей метки-заполнители, которые
пронумерованы с нуля и заключены в фигурные скобки.
 Форматирующие метки, после номера метки, могут
содержать количество выделяемых символов
(отделяется запятой).
 Знак количества выделяемых символов определяет
выравнивание: отрицательное значение выравнивает
по левому краю.
 Для чисел возможно описание формата и количество
знаков после запятой (отделяется двоеточием).
Строки: числовые форматы
Формат Описание формата Пример записи числа
:c Валютный $12,200.15
:d Десятичный 12200.150000
:e Научный 1.220015e+004
:f С фиксированной точкой 12200.150000
:g Общий 12200.15
:n Числовой 12200.150000
:p Проценты 1220,015 %
:x шестнадцатеричный 12 9DAF
Примеры форматирования строк
String^ str1 = String::Format("{0, -20}|{1,
4:g4}", "vasea", 2.1);
String^ str2 = String::Format("{0, 10}|{1,
10:c2}", "Po", 7);
String^ str3 = String::Format("{0:e6}",
0.123);
Преобразование строк
 Для преобразования некоторого значения в
строку используется метод ToString.
Int32 n = 10;
String^ str1 = n.ToString();
 Для преобразования строки в примитивный тип
используются методы-анализаторы Parse
примитивных типов или соответствующие
методы класса Convert.
int iv = Int32::Parse(str1);
Double dv = Convert::ToDouble(str2);
Шаблонные и родовые классы
Родовые функции
Шаблонное и родовое
программирование
Шаблонные и родовые классы
 Шаблонные классы эквивалентны шаблонам классов из стандартного
с++: инстанциирование шаблона класса происходит на этапе
компиляции.
 Родовые классы – шаблоны классов, инстанциирование которых
происходит во время выполнения программы.
generic<typename FirstType, typename SecondType>
ref struct ManagedPair{
typedef FirstType FirstType;
typedef SecondType SecondType;
FirstType first;
SecondType second;
ManagedPair(FirstType f, SecondType s)
: first(f), second(s){}
};
ManagedPair<String^, int>^ mp = gcnew ManagedPair<String^,
int>("Value", 10);
Родовые функции
 Определение родовых функций – при помощи
generic
generic<typename Type> where
Type:System::IComparable
Type Max(Type a, Type b){
return (a->CompareTo(b) > 0) ? a : b;
}
 Инстанциирование родовых функций происходит
при выполнении программы. Запись эквивалентна
записи шаблонных функций
System::Int32 a = Max(2, 3);
Ограничения на параметры
родовых функций
 В родовых функциях можно описывать
ограничения параметров шаблонов, что
позволяет определять ошибки использования
родовых функций.
 Ограничения параметров шаблонов
определяются при помощи ключевого слова
where
 Ограничения параметров шаблонов означают,
что данный тип должен реализовывать какую-то
функциональность (какой-то интерфейс)

More Related Content

PPTX
стандартная библиотека с++: введение
PPTX
контейнеры STL
PPTX
алгоритмы stl
PPTX
C++ и базы данных
PPTX
особенности программирования на с++
PPTX
библиотеки программирования
PPTX
Cpp/cli types
PPTX
PHP7 - что ожидать?
стандартная библиотека с++: введение
контейнеры STL
алгоритмы stl
C++ и базы данных
особенности программирования на с++
библиотеки программирования
Cpp/cli types
PHP7 - что ожидать?

What's hot (20)

PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
PDF
Python: ввод и вывод
PPT
5. java lecture io
PDF
5.1 Перегрузка операторов
PDF
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
PPT
Характерные черты функциональных языков программирования
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
PDF
Функциональное программирование и Clojure
PDF
Python. Обработка ошибок
PDF
Антон Полухин, Немного о Boost
PPTX
функции в Java script
PDF
Догнать и перегнать boost::lexical_cast
PPTX
Субъекторная модель
PDF
лек9 10
PPT
лабораторная работа №5
PDF
Михаил Давыдов — JavaScript: Базовые знания
PPT
Obj c
PPT
Stream API
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Python: ввод и вывод
5. java lecture io
5.1 Перегрузка операторов
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Характерные черты функциональных языков программирования
Объектно-ориентированное программирование. Лекция 5 и 6
Функциональное программирование и Clojure
Python. Обработка ошибок
Антон Полухин, Немного о Boost
функции в Java script
Догнать и перегнать boost::lexical_cast
Субъекторная модель
лек9 10
лабораторная работа №5
Михаил Давыдов — JavaScript: Базовые знания
Obj c
Stream API
Ad

Similar to Cpp/cli particularities (20)

PPTX
модуль 03 строки
PDF
Step cpp0201
PPTX
массивы.строки
PDF
книга с++
PDF
C++ for real_programmers
PDF
C++ Базовый. Занятие 12.
PDF
Основы С++ (массивы, указатели). Задачи с массивами
PDF
PDF
PDF
PDF
C++ Базовый. Занятие 05.
PPT
C++ tema 1
PDF
Основы С++ (операторы, типы данных, функции)
PPT
2 Константы и поля; методы и параметры; свойства.ppt
PPT
символы и строки
PPT
Rgsu04
PPT
Rgsu04
PPTX
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
PDF
C++ Базовый. Занятие 02.
модуль 03 строки
Step cpp0201
массивы.строки
книга с++
C++ for real_programmers
C++ Базовый. Занятие 12.
Основы С++ (массивы, указатели). Задачи с массивами
C++ Базовый. Занятие 05.
C++ tema 1
Основы С++ (операторы, типы данных, функции)
2 Константы и поля; методы и параметры; свойства.ppt
символы и строки
Rgsu04
Rgsu04
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
C++ Базовый. Занятие 02.
Ad

More from mcroitor (20)

PPTX
09 server mgmt_ii_ro
PPTX
09 server mgmt_ii_ru
PPTX
10 server security_ro
PPTX
10 server security_ru
PPTX
08 server mgmt_ro
PPTX
08 server mgmt_ru
PPTX
07 virtual hosts_ru
PPTX
07 virtual hosts_ro
PPTX
06 php instalation_ro
PPTX
06 php instalation_ru
PPTX
05 db server_deployment_ro
PPTX
05 db server_deployment_ru
PPTX
04 web server_deployment_ro
PPTX
04 web server_deployment_ru
PPTX
03 web server_architecture_ro
PPTX
03 web server_architecture_ru
PPTX
02 server hardware_ro
PPTX
02 server hardware_ru
PPTX
01 server definition_ro
PPTX
01 server definition
09 server mgmt_ii_ro
09 server mgmt_ii_ru
10 server security_ro
10 server security_ru
08 server mgmt_ro
08 server mgmt_ru
07 virtual hosts_ru
07 virtual hosts_ro
06 php instalation_ro
06 php instalation_ru
05 db server_deployment_ro
05 db server_deployment_ru
04 web server_deployment_ro
04 web server_deployment_ru
03 web server_architecture_ro
03 web server_architecture_ru
02 server hardware_ro
02 server hardware_ru
01 server definition_ro
01 server definition

Cpp/cli particularities

  • 2. Оглавление  Работа с массивами  Строки  Родовые типы и шаблоны  Смешение управляемого и неуправляемого кодов
  • 3. array – управляемый (многомерный) массив фиксированного размера ArrayList – динамический массив, совпадающий по функциональности со списком. List – управляемый список Работа с массивами
  • 4. Работа с массивами: инициализация  Объявление управляемых массивов похожа на инстанциирование шаблонов: array<int>^ a0; array<int, 5>^ a0; // 5 – размерность массива  Размеры массива указываются при инициализации: array<int>^ a1 = gcnew array<int>(6) {1, 2, 3, 4, 5, 6}; array<int>^ a2 = gcnew array<int> {1, 2, 3, 4, 5, 6}; array<int>^ a3 = {1, 2, 3, 4, 5, 6}; array<Double, 2>^ b0 = gcnew array<Double, 2> (3, 2); В инициализаторе можно использовать переменные.
  • 5. Работа с массивами: перебор элементов  обычный перебор, при помощи цикла for for(i = 0; i < a1->Length; i++) { Console::Write("{0} ", a1[i]); }  Использование конструкции for each for each(Int32^ value in a2) { Console::Write("{0} ", value); }
  • 6. Работа с массивами: копирование и сравнение массивов  При помощи методов класса:  Clone() – для поверхностного копирования (создание нового дескриптора на тот же участок памяти)  Copy() – для глубокого копирования (создание нового объекта в управляемой памяти)  Equals() , как и оператор сравнения, проверяет на равенство только дескрипторы
  • 7. Работа с массивами: ArrayList  Объявлен в пространстве имён Collections Collections::ArrayList^ a = gcnew Collections::ArrayList;  Не осуществляет контроль типов a->Add(10); a->Add("test"); a->Add(gcnew Object);  Для поддержки контроля типов рекомендуются родовые классы, например List родовым классом называются классы, поддерживающие параметризацию во время выполнения
  • 8. Работа с массивами: родовой класс List using namespace System:: Collections::Generic; List<Int32>^ l = gcnew List<Int32>(); l->Add(10); l->Add(21);
  • 10. Строки  Тип String представляет собой ссылочный тип, содержащий в себе последовательность символов Unicode, и предназначен для работы со строками.  Класс String представляет собой неизменяемую последовательность.  Для работы со строкой, изменяемой в рамках одной последовательности, используется StringBuilder.
  • 11. Работа со строками String^ str1 = gcnew String("test"); String^ str2 = " string"; String^ str3 = String::Concat(str1, str2); Console::WriteLine("{0}[3] = {1}", str3, str3->Chars[3]); if (str1->Equals(str2)) Console::WriteLine("str1 equals str2"); else Console::WriteLine("str1 NOT equals str2"); if (str3 == str2)Console::WriteLine("str3 equals str2"); else Console::WriteLine("str3 NOT equals str2"); if (String::ReferenceEquals(str1, str2)) Console::WriteLine("ref str1 equals ref str2"); else Console::WriteLine("ref str1 NOT equals ref str2"); оператор сравнения, как и метод Equals, проверяют на равенство значения строк.
  • 12. Работа со строками  Оператор присваивания создает еще одну ссылку на тот же объект, метод Copy создает новый объект.
  • 13. Работа со строками: форматирование  Для создания отформатированных строк используется метод Format.  Форматирование строк определяется форматирующей строкой, содержащей метки-заполнители, которые пронумерованы с нуля и заключены в фигурные скобки.  Форматирующие метки, после номера метки, могут содержать количество выделяемых символов (отделяется запятой).  Знак количества выделяемых символов определяет выравнивание: отрицательное значение выравнивает по левому краю.  Для чисел возможно описание формата и количество знаков после запятой (отделяется двоеточием).
  • 14. Строки: числовые форматы Формат Описание формата Пример записи числа :c Валютный $12,200.15 :d Десятичный 12200.150000 :e Научный 1.220015e+004 :f С фиксированной точкой 12200.150000 :g Общий 12200.15 :n Числовой 12200.150000 :p Проценты 1220,015 % :x шестнадцатеричный 12 9DAF
  • 15. Примеры форматирования строк String^ str1 = String::Format("{0, -20}|{1, 4:g4}", "vasea", 2.1); String^ str2 = String::Format("{0, 10}|{1, 10:c2}", "Po", 7); String^ str3 = String::Format("{0:e6}", 0.123);
  • 16. Преобразование строк  Для преобразования некоторого значения в строку используется метод ToString. Int32 n = 10; String^ str1 = n.ToString();  Для преобразования строки в примитивный тип используются методы-анализаторы Parse примитивных типов или соответствующие методы класса Convert. int iv = Int32::Parse(str1); Double dv = Convert::ToDouble(str2);
  • 17. Шаблонные и родовые классы Родовые функции Шаблонное и родовое программирование
  • 18. Шаблонные и родовые классы  Шаблонные классы эквивалентны шаблонам классов из стандартного с++: инстанциирование шаблона класса происходит на этапе компиляции.  Родовые классы – шаблоны классов, инстанциирование которых происходит во время выполнения программы. generic<typename FirstType, typename SecondType> ref struct ManagedPair{ typedef FirstType FirstType; typedef SecondType SecondType; FirstType first; SecondType second; ManagedPair(FirstType f, SecondType s) : first(f), second(s){} }; ManagedPair<String^, int>^ mp = gcnew ManagedPair<String^, int>("Value", 10);
  • 19. Родовые функции  Определение родовых функций – при помощи generic generic<typename Type> where Type:System::IComparable Type Max(Type a, Type b){ return (a->CompareTo(b) > 0) ? a : b; }  Инстанциирование родовых функций происходит при выполнении программы. Запись эквивалентна записи шаблонных функций System::Int32 a = Max(2, 3);
  • 20. Ограничения на параметры родовых функций  В родовых функциях можно описывать ограничения параметров шаблонов, что позволяет определять ошибки использования родовых функций.  Ограничения параметров шаблонов определяются при помощи ключевого слова where  Ограничения параметров шаблонов означают, что данный тип должен реализовывать какую-то функциональность (какой-то интерфейс)