|  | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Трансляция кода Delphi в код C++BuilderИсточник: winapi Куковинец А.В Цель этой статьи состоит в том, чтобы помочь вам понять основные различия и подобия между C++ и Object Pascal (язык, используемый в Delphi от Borland), и помочь вам в преобразовании проекта написанного на Delphi в проект написанный на C++ (С++Builder от Borland).В жалбнейшем в этой статье вместо терминов Object Pascal и Delphi будет употребляться аббревиатура "OP". 
 
 Следует отметить, что язык С++ является регистро зависимым, в отличие от OP , который таковым не является. 
 
 C++ Объявление переменных  OP // ... какойто код ... C++ Для обработки строк имеется ряд библиотечных функций. Основные из них strcat - конкатенация (склеивание) двух строк, strcmp - сравнение двух строк, strcpy - копирование одной строки в другую, strstr - поиск в строке заданной подстроки, strlen - определение длины строки, strupr - преобразование символов строки к верхнему регистру, sprintf - построение строки по заданной строке форматирования и списку аргументов и ряд других функций. OP Delphi поддерживает строки практически неограниченной длины (до 2 Гб), в дополнение к 255-символьным строкам, известным как pascal-строки. Новая директива компилятора $Н позволяет контролировать смысл использования зарезервированного слова string. Состояние этой директивы по умолчанию ($Н+) подразумевает использование в качестве типа string длинных строк. $Н- подразумевает использование коротких 255-символьных pascal-строк. Все компоненты Delphi используют длинные строки.Следует отметить, что, вне зависимости от состояния директивы $Н, если специфирована максимальная длина строки, меньшая 255, то подразумевается короткая строка (ShortString). Назначение длины строки с использованием квадратных скобок всегда подразумевает подтип ShortString. Длинные строки, введенные в Delphi 2.0, в большинстве случаев совместимы со строками старого типа. При этом необходимо принимать во внимание следующие особенности их использования: 
 Поскольку реально длинные строки не дублируются, а для них поддерживаются счетчики использований, то присваивание длинных строк происходит намного быстрее по сравнению с короткими строками.Несмотря на то, что большая часть кода, используемого при работе со строками интероперабельно для коротких и длинных строк (то есть применимо к обоим видам строк), тем не менее, некоторые операции над короткими строками не применимы к длинным строкам. Длинные строки не могут передаваться в параметры типа OpenString или как var-параметры, соответствующие коротким строкам. Массивы Массивы - упорядоченные последовательности одного типа данных (могут включать также и объекты). Методы для объявления массива в C ++ и OP - различные. С++ OP var  ArrayS: array[1..31] of double;  Оба языка поддерживают многомерные массивы С++ double dMatrix[50] [20]; OP dMatrix: array[1..50, 1..20] of double; Приравнивание и сравнение переменных C++ Сравнение производиттся оператором "двойное равно" (==), приравнивание одним равно (=) int i,j; OP Сравнение производиттся оператором "равно" (=), приравнивание двоеточие+одно равно (:=) ... Константы - значения, которые не изменяются . Идентификатор может быть объявлен как константа, и в C ++ и OP. И C ++ и OP константам должны быть назначены значения при их объявлении. С++ При объявлении константы перед типом данных используется ключевое слово const В С++ константы также можно определять через директиву препроцессора #define но на практике это устарело. Так как компилятор не может выполнить контроля соответствия типов(он не может определить что это ini или double) OP Константы, подобно переменным, должны быть объявлены в блоке кода "const" в начале определения процедуры или функции ,определения или в декларации объекта . function PayBack_d(var dAmount: double): double;  Блоки Кода, которые исполняют определенную задачу в C ++, называются "функциями" независимо от того, действительно ли они возвращают значение. В OP, функции должны возвращать значение, процедуры не возвращают значение. В C ++, все функции должны иметь прототип, объявленный перед применением (так что транслятор может сравнивать обе функции , чтобы гарантировать соответствие). В OP, однако, функция или определение процедуры могут опустить (но это не желательно) параметры и опускать тип возвращения.Декларация функции в C ++ и определений требует фигурных скобок () независимо от того, действительно ли передаются любые параметры. OP функции и процедуры не нуждаются в фигурных скобках () при их объявлении или определении , если не передается никаких параметров,для вызова функции или процедуры. С++ Реализация  OP Каждая функция и процедура должны быть идентифицированы включением ключевого слова "function" или "procedure" в начале каждого определения . procedure LoanC.SetNewIntRate;  И C ++ и OP могут передавать параметры по значению или по ссылке или передавать константы... C++ по значению ... double IntSinceLastAddDate_d(double dAvailCash);  C++ по ссылке ... double IntSinceLastAddDate_d(double &dAvailCash);  C++ константы... double IntSinceLastAddDate_d(const double dAvailCash);  Вообще, C ++ более компактен чем OP. Но, C ++ не имеет инструкцию with ... do с... Это неудачно, потому что это действительно - большая особенность OP. C ++ код будет более подробным по сравнению с OP. В C ++, когда Вы должны обратиться к членам данных, вы заканчиваете оператор подобно этому... Но в OP, Вы можете делать это гораздо менее читаемым, делая так... Комментарии OP в отличие от С++ поддерживает 3 вида комментариев. Это связано с тем, что Borland при написании Delphi внес в язык Pascal очень много элементов из C++.В часности добавился однострочный комментарий как в С++ Управляющие конструкции (if, else, switch...) Существует пять структур управления на обоих языках, и они весьма подобны. Этот обзор займет много места . 1. Конструкция if ... else 	C++
	
	if(<логическое выражение>) // в скобках единственное выражение
	{ 
	...
	}
	else if(<логическое выражение>)
	{
	...
	}
	else
	{
	...
	}
	
	OP
	
	if <логическое выражение> then 
	begin
		{единственное выражение не должно находиться в скобках}
	...
	end
	else if <логическое выражение> then
	begin
	....
	end
	else
	begin
	...
	end; {только самый последний  "end" в выражении терминируется точкой с запятой}
2. Конструкция switch/case 	C++
	
	switch(<целочисленная константа>)
	{
		case iX: ... break;
		case iY: ... break;
		default: ...
	}
	
	OP
	
	case <целочисленная выражение переменная или константа> of
		{здесь "begin" не нужен}
		iX: 
		begin
		...
		end; {точка с запятой после каждого "end";}
		iY:
		begin
		...
		end;
		else {двоеточие не требуется}
		begin
		...
		end;
	end;{вот здесь "end;" }
3. Цикл for 	C++
	
	for(iCount = 0; iCount <= 10; iCount++)
	{ 
		// инкреметн нужен для цикла, iCount++,может быть увеличен
		// на любое значние не только на 1
	...
		break; // для выхода из цикла
		continue; // для продолжения цикла
	...
	}
	
	
	OP
	
	for iCount := 1 to 10 do
	begin
	... {цикл for может увеличивать счетчик только на 1}
		break; { для выхода из цикла }
		continue; { для продолжения цикла }
	...
	  end  ;
Есть одно различие между выполнением "break" и "continue" в языках. В C ++, break, и continue - ключевые слова - часть языка; 
В OP это библиотечные процедуры.Хотя используются также.
4. Цикл while 	C++
	
	while(<логическое выражение>) 
	{
		// выражение проверяется в самом начале цикла,так что код может никогда не использоваться
		// если выражение вернет false
	...
		break; // для выхода из цикла
		continue; // для продолжения цикла
	...
	}
	
	
	OP
	
	while <логическое выражение> do
	begin
		{ выражение проверяется в самом начале цикла,так что код может никогда не использоваться
		  если выражение вернет false }
	...
		break; { для выхода из цикла }
		continue; { для продолжения цикла }
	...
	end;
5. Цикл do ... while 5) The do/repeat ... loop construct:
	C++
	
	do
	{
		// выполняется некий код, затем проверяется выражение. В этом случае код выполнится хотябы один раз
	...
		break; // для выхода из цикла
		continue; // для продолжения цикла
	...
	}while(<логическое выражение>);
	
	
	OP
	
	repeat
		{ eвыполняется некий код, затем проверяется выражение. В этом случае код выполнится хотябы один раз 
		  заметьте что в цикле нет ключевых слов begin ... end  }
	...
		break; { для выхода из цикла }
		continue; { для продолжения цикла }
	...
	until <логическое выражение>;
 |