Издалека
Не удивлюсь, что имя Бьёрн Страуструп скажет мало нынешнему поколению веб, а в частности PHP программистам. Так вышло что, безумно популярный, практически идентичный по синтаксису PHP написанный на C, дает мало представления о программирование на C/C++.
История C++ началась очень давно. Если зрить в корень, в язык программирования C, то в новом году будет вот уже 40 лет с момента начала разработки сотрудниками «Bell Labs» Кеном Томпсоном и Денисом Ритчи великого языка. C — лаконичный, имеющий на тот момент современный набор конструкций управления потоком выполнения, структур данных и обширный набор операций. История продолжилась в середине 80х годов прошлого века. Сотрудник фирмы «Bell Laboratories» Бьёрн Страуструп дал жизнь новому витку эволюции популярнейшего и мощного языка C. «C с классами».
«C с классами» получил свое имя в 1983. C++ в 90х годах стал одним из самых широко применяемых языков программирования, благодаря мощи предка и объектно ориентированному подходу который дал на мой взгялд безкрайние возможности, придя на смену (опять же только по моему мнению) узконапрявленным языкам программирования фроде Fortran. Конечно тут стоит оговориться что во многом это заслуга именно C, с которым C++ в итоге пошли раными дорогами.
Для чего?
Для того что бы показать откуда растут ноги у PHP а заодно и C++ приведу пример кода на C:
#include <stdio.h>
int main(void)
{
printf(«Привет Хабрахабр!\n»);
return(0);
}
Типичное консольное приложение. Вначале подключаем заголовок с описанием функций ввода вывода stdio.h (standart input/output). После во входной точке приложение (тут наверное стоит провести аналогию с index.php, в C это функция main)
Немногим будет отличаться хеллоу ворлд и на С++.
#include <iostream>
int main(void)
{
cout << «Привет Хабрахабр!»;
return(0);
}
Новая библиотека ввода вывода и вывод на экран оператором сдвига влево. Стоит отметить и что оба примера отлично будут работать в C++.
Не буду заострять внимания на различиях C и C++, стоит лишь оговориться, что обратная соместимость C с C++ предусмотриться, но ввиду некотрых нюансов не гарантируется. Но статья не об этом.
Типы данных
Главное что меня удивило и насторожило в PHP, когда я сменил профиль дейтельности на веб, то, что отсутствуют определения типа перменной. Если кто знаком с VB жаргоном, все переменные в PHP — variant. Т.е не требуют явного указания типа и можно без лишних телодвижений сложить int и string.
String? Нет такого типа в C++! Но есть замечательная библиотека STL (стандартная библиотека шаблонов), которая предоставляет нам функционал позволяющий жанглировать строками. По другому только char *string = new char[64] (ну или другая длинная строки). Сложно? Да не стоит об этом думать когда есть STL! Эта библиотека достойна дополнительной статьи, если интерес будет, будет и статья.
Ладно хвататит уже лирики. Обещал же.
Типы данных C++:
int — целое значение.
bool — булево, true или false
char — символ
float — число с плавающей точкой.; например 3.14
double — длинное целое значение
Объявление переменной происходит так:
int foo;
float bar = 3.14;
Приведение одного типа к другому:
foo = (int)bar;
Кому то покажется это все лишними телодвижениями, но поверьте гораздно проще определить источник проблемы, когда компилятор ругается на приведение несхожих типов друг к другу.
Указатели и ссылки
Все данные как известно хранятся в памяти. Не секрет? Не секрет.
Что бы получить адрес перменной делаем так:
&foo
Зачем? А что бы сохранить его:
int *bar = &foo
А для чего все таки? Ну например адрес можно передать в функцию а потом там изменить значение перменной:
functPp(&bar);
int functPp(int *var)
{
*var++; // Тут используется оператор разименования, т.е обращение непосредственно к перменной
}
Можно и проще. Воспользуемся ссылкой:
functPp(bar);
int functPp(int &var)
{
var++; // А тут ничего разименовывать нет нужды
}
Указатели одна из тех возможностей которых мне не хватало в самом начале работы c PHP. Потом я совсем и забыл для чего нужны эти самые указатели :)
Можно например передать указатель на класс который наследован от classParent в массив указателей родительского класса. А потом в цикле вызывать абстрактный член класса. Например action или render. Для чего, вы поймете если предствите невероятное кол-во объектов в игре у которых свои action и render, а обработать их в одном цикле ой как нужно. Это на примере игры. Думаю каждый из вас найдет указателям в воображение свое применение.
Классы
class classSample
{
private:
int privateValue1;
int privateValue2 = 1998;
public:
string name;
string lastname;
classSample(void) // Стандартный конструктор
{
name = «Хабра»;
lastname = «Хабр»;
}
classSample(string _name, string _lastname) // Конструктор с передачей параметров
{
name = _name;
lastname = _lastname;
}
bool action()
{
privateValue1 = privateValue2 = 2009;
}
}
Как вы уже наверняка заметили, все очень знакомо и близко. Пугает лишь два конструктора? А меня не пугает. Меня пугает отсутствие подобных фич что в PHP что в модных альтернативах Python и Ruby. А как было бы удобно. Это свойство называется полифоризм, или попросту перегрузкой функций. Перегружать в C++ можно практически все виды операторов, от математических функций и функций сравнения до приведения к определенным типам данных. Это позволяет нам очень круто оперироват нашими классами, фактически создавая новые типы данных. В PHP к сожалению (а может к счастью? кто знает) этого нет. А мне так хочется порою…
Это первая часть планируемой ретроспективы в мою память с последующим окунанием в программирование графики. Или попросту игр. Приятного вечера. Я пошел работать. Без перегрузок, без указателей и без компиляции…
Продожение следует…
* This source code was highlighted with Source Code Highlighter.
_________
Текст подготовлен в ХабраРедакторе