понедельник, 24 января 2011 г.

Мигрируем Object Pascal >> C++


Наверно вы думаете, что это статья для бедных и несчастных программистов, которым по воле судьбы, пришлось изучать Pascal... Это не так! Эта статья для лентяев не желающих прочитать 1-2 сотни страниц в книге, что бы понять как выглядит код на С++. Если вы не такой, ноги в руки и бегом покупать/качать книжки. Статья не ориентирована на тормозов, все вы должны схватить на лету, что бы просто ускорить процесс обучения и ознакомления с языком. Данная статья не сделает вас С++ программистами. Я советую ее прочитать перед прочтение какой либо книги. Например Джесс Либерти "С++ за 21 день".

Начнем с переменных.
Во первых в С++ действует локально-линейная схема. Переменная объявленная в блоке функции, доступна во всем блоке с места своего объявления. Да, вы правильно поняли, переменные можно объявлять везде(почти везде). В паскале вы привыкли объявлять переменные в начале блока, и они доступны везде. В С++ переменная, объявленная в 50-ой строке программы, доступна с 50 строки и до конца операторных скобок. Кстати, операторные скобки в С++ действительно операторные скобки и выглядят они так "{" (begin) и "}"(end). Как и в pascal'e, разделителем операторов служит ";".
Ладно, хватит теории, давайте практику.
Кстати, совсем забыл в С++ регистр имеет значение!
var a,b: integer;
c: char;
Знакомо? А теперь код в С++
int a,b;
char c;
Просто, правда?. Для наглядности напишем Hello World на двух языках. Pascal:
programm Hello_World;
var a: string;
begin
a:= 'Hello World';
Writeln(a);
end.
В С++ это выглядит иначе:
#include <iostream> //функции ввода-вывода

int main(int argc, char* argv[]) //главная точка входа в программу
{
    std::string myStr = "Hello World!"; //std::string - тип строки(имя_пространства::класс)
    std::cout << myStr.c_str(); //отправляем на поток вывода нашу строку, преобразовывая ее в тип Си строк
 return 0; //выход из программы
}

Ну что ж, а теперь по порядку. Оператор присвоить теперь просто "=". НО! Очень многие новички, не могут понять почему их программа работает не правильно. Потому, что они путают оператор присвоения с оператором сравнения. Для С++ "=" - оператор присвоения, а "==" - оператор сравнения. НЕ ПУТАЙТЕ, юные подаваны.
Еще отличия. В Pascal'e 'строка'. В С++ по другому: "это строка". Но 'B' - это символ! Не забывайте.
Конец программы в С++ как вы уже поняли, там где заканчивается главная функция. То есть тело программы. А это наша int main(). А откуда компилятор понял, что main это функция, ведь int a - это переменная? Очень просто:
    int a; //переменная
    int a[50]; //массив
    int a(); //функция

Рассмотрим стандартные циклы паскаля и С++.
Цикл for, паскаль:
for i:=1 to 20 do
begin
end;
А вот так цикл for выглядит в C++:
for(i=1; i < 20; i++)
{
}
Причем он лучше. Можно не только инкрементировать переменную, но и декрементировать. Как видно конструкция проста:
for(начальное значение переменной; условие; действие над переменной).
Теперь рассмотрим более простой цикл.
while a = b do
begin
end;
Аналог С++:
while (a==b) //Не забываем про оператор сравнения
{
}
Конструкция do while похожа на pascal вариант:
do
{
}
while ( a==b)
Мне никогда не нравилась следующая конструкция:
case a of
    1:
    2:
end;
В С++ она куда симпатичнее:
switch(a)
{
    case 1:
    case 2:
}
Теперь с классами:
class Circle //имя класса
{
private:
    int radius; //скрытая переменная
public:
    Circle(int r); //конструктор
    ~Circle(); //деструктор
    int GetRadius(); //функция возвращающая радиус
    void SetRadius(int value); //функция устанавливающая радиус
}
Все просто, правда? Давайте реализуем этот класс. Вот пример:
Circle::Circle(int r)
{
    this->radius = r; //this - указатель на текущий класс(Circle)
}

Circle::~Circle()
{
}

int Circle::GetRadius()
{
    return this->radius;
}

void Circle::SetRadius(int value)
{
    this->radius = value;
} 
Ничего сложного. Задавайте свои ответы.
P.S. Автор ничего против самого языка Pascal не имеет. Мало того, пишет на нем программы. Но это не мешает ему все дальше и дальше углубляться в С++.

Комментариев нет:

Отправить комментарий