Какие проблемы Возникают При изучении C++, если я пришел с PHP/Java?


Мне нужно изучить C++, чтобы научиться создавать приложения Nokia WRT и/или maemo. Мне нужно знать, какие ошибки и какой аспект C++ мне нужно/нужно изучить или сосредоточиться больше. Одна вещь, которая пришла мне в голову, - это то, что в C++ нет сборщика мусора. Поэтому мне нужно сосредоточиться на типе переменной. Но есть ли еще что-то действительно важное, и я не могу это игнорировать?

Author: ariefbayu, 2010-03-30

6 answers

Главная задача - попытаться представить C++ с точки зрения того, чем он отличается от PHP или Java.

Извините, но это просто так не работает. C++ отличается от этих языков почти во всех важных аспектах, помимо синтаксиса арифметики. Иногда различия неуловимы. Вам нужно изучить его свежим и не думать, что что-то, что подходит для PHP или Java, будет хорошо работать для вас в C++.

Тем не менее, общие трудности включают в себя:

  • ресурс управление: RAII; реализация конструкторов копирования, деструкторов и operator=; избегание необходимости реализации операторов копирования ctors, dtors, operator=.
  • понимание того, что такое ссылки, указатели, значения и автоматические переменные.
  • избегание неопределенного поведения (myarray[i] = i++; является любимым). PHP и Java являются более "жестко" определенными языками, чем C++: во-первых, поведение программы с большей вероятностью будет определено и, следовательно, надежно. Из-за этого отдельные реализации более похожи, чем Реализации на языке C++. Довольно легко написать программу на C++, которая не просто делает что-то неправильно, она делает совершенно разные вещи при разных запусках, включая сбой, повреждение данных и т.д.
  • обучение безопасному и эффективному использованию шаблонов, множественного наследования, перегрузки операторов и других функций, с которыми вы не знакомы.
  • правильные идиомы для создания и перехвата исключений (выбрасывать по значению, перехватывать по ссылке, не выбрасывать из деструктор).
  • написание переносимого кода (понимание разницы между тем, что гарантирует стандарт, и тем, что не гарантируется, но что делает ваша реализация. поведение, определяемое реализацией, такое как размеры фундаментальных типов).
  • Стандартные библиотеки C++ ограничены по сравнению с Java или PHP. Вы также будете использовать нестандартные библиотеки. Например, Maemo использует GTK+ и/или Qt. Часто ответ на вопрос "как я могу сделать X в C++" звучит так: "вы не можете сделать это с помощью только стандартный C++, вам нужны API для конкретной платформы или портативная библиотека, скомпилированная для вашей системы". X может быть графикой, сокетами, регулярными выражениями, многопоточностью, обработкой XML, криптографией. Особенно с мобильными платформами, вам нужно следить за версиями ОС, время от времени все может и будет меняться под вашим руководством.
 13
Author: Steve Jessop, 2010-03-30 02:39:17

Научитесь использовать контейнеры STL прямо сейчас. Хотя синтаксис итератора не подходит для людей, говорящих на других языках, он предоставляет вам встроенные структуры данных, которые вы обычно используете в коллекциях Java или PHP в качестве встроенных (карты/хэши, списки, стеки, векторы), без написания фанкового кода указателя с динамическим распределением, что так часто отвлекает новичков от изобретения колеса и возни с ошибками памяти.

Кроме того, если вы пишете код для конкретной платформы (Qt или Microsoft Приложение MFC, например) вы часто будете видеть примеры использования контейнеров, специфичных для фреймворка, где STL был бы более разумным выбором. STL (и Boost) могут заполнить пробелы. Использование фреймворка с графическим интерфейсом не означает, что вы должны использовать все, что предлагает фреймворк. Держитесь подальше от нестандартных контейнеров, если только вы не знаете без тени сомнения, что никогда не будете переносить программу или повторно использовать части кода.

 3
Author: codenheim, 2010-03-30 02:48:44

Я бы сказал, что это не тип переменной, а то, чтобы убедиться, что вы очистили свою память. Java очистит вашу память, но C++ не сделает этого за вас. В противном случае важно управлять своими ресурсами при наличии исключений.

С положительной стороны, вы получите то, что они называют "детерминированным завершением". Огромная выгода. Посмотрите вверх, как аббревиатуру, "RAII". Я думаю, что это, возможно, одна из самых важных идиом в C++.

Это означает "Приобретение ресурсов - это Инициализация", но на самом деле это означает: "Когда этот деструктор сработает, я буду убирать за вами, даже при наличии исключений". На практике это означает, что любой объект, который вы создаете или открываете, который вам нужно закрыть или удалить, вы можете удерживать с помощью интеллектуального указателя. Умный указатель будет убирать за вами. Это очень, очень мощно, как только вы поймете это и начнете использовать. Это делает вашу проверку ошибок, обработку исключений и код очистки ресурсов очень простыми.

 2
Author: jwismar, 2010-03-30 02:03:01

Один из тех, кого я видел, некоторые Java-программисты делают при переходе на C++, - это "попытка поймать" утечки памяти. Например:

try {
  myType pVar = new myType();
  DoSomething(pVar);
  delete pVar;
}
catch (exception) {
  cout << "Doh!  Something failed!" << endl;
}

В приведенном выше случае, если метод "doSomething() создает исключение, PVAR никогда не будет удален, поэтому произойдет утечка памяти.

(Решения для этого включают: объявление всех переменных перед блоками try/catch, использование auto_ptr или просто избегание try-catch для начала!)

 2
Author: Dan, 2010-03-30 02:40:45

Самое важное (на мой взгляд) заключается в том, что все является типом значения, поэтому, если вы передадите массив в функцию, подобную этой:

void do_stuff(std::vector<int> my_array)
{
  ...
}

Затем my_array, который передается, является копией указанного аргумента. Копирование всего такого массива стоит дорого, поэтому, как правило, вы хотите пройти по ссылке const:

void do_stuff(const std::vector<int>& my_array) 
{
  ...
}

(Примечание: опустите const, если вы хотите изменить оригинал my_array).

 1
Author: Peter Alexander, 2010-03-30 02:05:44

Мне любопытно, почему "PHP/Java" здесь рассматривается как единое целое. Это не так.

  • Переход Java->C++ довольно велик, но он выполним, вам просто нужно изучить много дополнительного синтаксиса, несколько дополнительных понятий, таких как деструкторы, конструкторы копирования, нарезка объектов и перегрузка операторов, и прийти к соглашению с библиотекой C++.
  • Переход PHP->C++, с другой стороны, на другой порядок больше, поскольку он касается (а) очень плохо определенного источника язык, (б) язык, основанный на шаблонах, а не на классах, и (в) язык, который выполняется в специальной среде.
 1
Author: user207421, 2014-05-05 03:52:04