Подтвердить что ты не робот

C: Good Habits re: Переход на С++

Я изучаю C в Varsity за стеснительность 2 месяца, и в следующем году мы перейдем к С++.

Есть ли какие-нибудь привычки, с которыми я должен работать в своем программировании на языке C, который поможет в будущем перейти на С++, или лучше подумать о них совершенно отдельно?

Когда вы изучили C, а затем С++, сделали так, как вы каким-либо образом закодировали сменю C?

4b9b3361

Ответ 1

Уже есть много хороших ответов. Мой будет более ориентированным на мышление.

Данные против действия!

  • В C все делается так, чтобы думать, как "Применить этот эффект к этим данным".
  • В С++ это больше похоже на "Данные должны вести себя".

В то время как "Данные должны вести себя" могут быть выполнены в C (и это сделано!), на С++ все, что необходимо для реализации этого легко, уже доступно: инкапсуляция, конструкторы, переопределение перегрузки, шаблоны и т.д.

Я нашел эту идею "Data should behave" очень хорошим руководящим принципом при кодировании на С++.

Синтаксический сахар С++ не является необязательным

Вы найдете много возможностей С++, которые можно было бы сделать на C, и некоторые люди используют его в качестве предлога, чтобы не изучать их. Это мышление опасно (это часть " рассматривает С++ как новый язык, а не расширение", замеченную в некоторых сообщениях).

Побочным эффектом избежания написания С++ способом С++ является то, что, хотя разработчик С++ должен понимать код на С++, он/она не должен понимать вашу маленькую личную структуру, имитирующую С++-сахар с функциями C-only. Фактически, он/она не будет интересоваться вашей структурой. По правде говоря, он/она будет только чувствовать жалость/презрение к вам, потому что вы потеряли драгоценное время, производя это. В конечном счете, он/она будет ненавидеть вас, если он/она должен использовать вашу инфраструктуру вместо сахара С++.

Руководящие принципы, такие как "Я могу сделать это на C", просто заставят вас пропустить вагон. Лучше не начинать изучать С++ вообще, если у вас уже есть такой C-ориентированный способ мышления.

Ваш язык выбора никогда не будет лучшим. Вы должны стать лучшими. Если вы пишете код на С++, напишите его на С++.

C-совместимый код С++ - это семантическая ошибка

Typedefing ваших структур, чтобы сделать их компилируемыми компилятором C, является плохой шуткой. Использование указателей вместо ссылок - это пощечина для вашего будущего. extern "C" сделает ваш код слабее, а не сильнее. И использование void * для родословности будет только увеличивать количество других кодеров С++, которые с радостью заплатят, чтобы ваша голова была удалена эффектно болезненным способом.

Никогда не надо писать C-совместимый код, если вы действительно действительно действительно.

Вы просто утомляете себя трудоемким стилем кодирования для функции, которую вы никогда не будете использовать.

Компилятор - мощный друг/враг

Рабочий низкий уровень имеет странные эффекты для некоторых разработчиков. Они верят, что они контролируют скомпилированный код. Делегирование этого элемента управления с конструкциями более высокого уровня для них затруднено.

Хорошим примером этого является то, что он рисует шаблон конструктора/деструктора, потому что " иногда конструкторы занимают слишком много времени... Лучше сделать это по-моему...".

Компилятор С++ вполне способен оптимизировать, по-видимому, неоптимизированный код. Фактически, код, созданный компилятором, может сильно отличаться от того, который, по вашему мнению, вы создали.

Не пытайтесь быть лучше/умнее, чем компилятор, потому что:

  • Возможно, вы уже проиграли бой, поскольку даже старые компиляторы обычно производят лучший код, чем вы можете мечтать сегодня.
  • Даже если вы сегодня выиграете бой, он автоматически превратится в поражение завтра, поскольку компиляторы станут лучше и лучше в будущем, поэтому ваш "оптимизированный код" сегодняшнего дня станет узким местом программы и рефакторингом в следующие годы (не говоря уже о позорных воспоминаниях для вас).

Итак, доверяйте своему компилятору.

Не микроуровнеруйте производство своего кода. Сделайте свою работу, и пусть компилятор сделает свое дело.

Обратите внимание, что эта точка не должна использоваться для оправдания производства медленного/неэффективного кода. Если преждевременная оптимизация является корнем всего зла, вы все равно должны использовать свои знания языка и компилятора для создания хорошего и эффективного кода (см. Следующий пункт).

Знайте преимущества/drowbacks/затраты для каждой конструкции С++

Например, факт, что виртуальные методы добавляют одно косвенное отношение к функции вызова функций для некоторых людей, производительность будет значительно снижаться. По правде говоря, проблемы с производительностью часто происходят где-то еще.

Незнание не является оправданием.

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

Таким образом, вы не только не будете платить за то, что вам не нужно (это руководящий принцип С++), но вы также получите прибыль от того, что стоит вам ноль, но приносит вам много.

Будьте скромными

Есть люди, которые проводят исследования на С++, которые были лучше на С++ в день их рождения, чем большинство из нас когда-либо будет. Даже если мы игнорируем Stroustrup, такие имена, как Meyers, Abrahams, Alexandrescu, Sutter и т.д. регулярно появляются вместе с новыми идеями. Несмотря на (или как следствие) его внешний вид, STL является революционной библиотекой. И библиотека, подобная Boost, несмотря на ее "малый размер" по сравнению с некоторыми полными фреймворками (такими как Java или .NET API), является массивный хранилище отличного кода, предлагаемого вам для изучения.

Просто потому, что вы обнаружите новую функцию "странный" или "чужой", не стоит ее недооценивать. Пытаясь понять это, PERHAPS принесут вам еще один инструмент в вашем распоряжении, и ВСЕГДА увеличит ваше владение языком, и ВСЕГДА сделает ваш мозг работать, что хорошо в бизнесе разработчиков.

Большинство людей, которых я знаю, кто провалил их "преобразование в С++", просто предположил, что эта или эта функция бесполезна, потому что они не удосужились ее понять.

RAII!!!!

Если вы не знаете, что это такое, узнайте об этом.

Без RAII ваш код на С++ - это просто прослушиваемый код, который избегал ошибки компиляции.

RAII - это самое важное понятие С++.

Все остальное связано.

Ответ 2

Лучший совет, вероятно, относится к ним как к совершенно отдельным языкам. Да, большинство C-кода могут быть скомпилированы компилятором С++, но обычно это не очень хороший способ.

C - очень низкий уровень хакерского языка. То, что вы видите, это то, что вы получаете. Он имеет указатели и структуры, поэтому вы используете указатели и структуры. У этого есть очень маленькая безопасность типа, таким образом Вы игнорируете безопасность типа как можно больше.

С++, с другой стороны, допускает огромное количество абстракций. Вместо указателей вы обычно захотите использовать итераторы, которые ведут себя концептуально как указатели, но не являются (или могут и не быть).

Вместо того, чтобы отбрасывать информацию о типе (например, если функции принимают void *, поэтому они будут работать с любым типом указателя), вы можете использовать шаблоны для сохранения безопасности типов и по-прежнему иметь возможность повторно использовать одно и то же определение одной функции.

И вам предоставляется отличная стандартная библиотека, которая позволяет вам выражать сложные алгоритмы с точки зрения простых предопределенных строительных блоков.

С++ - это язык с несколькими парадигмами. Некоторые ответы здесь говорят о том, что С++ объектно-ориентированный, что частично верно. У него есть поддержка объектно-ориентированного кода, да, но это не то, что С++.

С++ также поддерживает универсальное программирование, которое часто предпочтительнее для ООП. Он также имеет ограниченную поддержку для функционального программирования. И, конечно же, он по-прежнему поддерживает процедурное программирование в стиле C. Трюк на С++ заключается в том, чтобы понять все это, поэтому вы знаете, что использовать когда. Это Сила Сила, способность переключаться между ними и смешивать все эти парадигмы. Люди, которые называют С++ языком ООП, упускают такой же смысл, как люди, которые называют его улучшенным C. Он позволяет писать код в любом из этих стилей, но ни один из них не стоит сам по себе. C - лучший C-подобный язык, и есть много лучших языков ООП. Если вы хотите придерживаться одной парадигмы, используйте язык, предназначенный для этого.

Ответ 3

Забавно, как многие люди утверждают, что C и С++ "совершенно разные", и как "С++ объектно-ориентированный, C не является"...

Во-первых: С++ изначально был разработан как расширение языка C. На самом деле стандартная документация на С++ относится к стандарту C. Это правда, что многие вещи выполняются на С++ иначе, чем на C, но утверждать, что эти два полностью разделены, немного отстают. Хороший код C может быть скомпилирован с помощью компилятора С++, и для некоторых тривиальных проблем решения C и С++ могут выглядеть примерно одинаковыми.

Во-вторых, не позволяйте себе обманывать себя, полагая, что С++ - это "объектно-ориентированный язык". С++ - это язык, поддерживающий ориентацию объектов, true. Но он также поддерживает универсальное программирование и процедурное программирование. Сфокусироваться только на аспекте ООП С++ отнимает большую часть своей мощности.

Что касается привычек, чтобы войти... не слишком привязаны к строкам стиля C (char *) и массивам (int foo[]). Оба они очень редко используются в С++, так как есть гораздо более мощные (и удобные) замены, string и vector.

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

При разработке кода на C начинайте с struct хранения соответствующих данных (например, полей адреса), а затем создавайте функции, работающие над этим типом структуры (address_read( struct address_t * ), address_write( struct address_t * ), address_modify_name( struct address_t *, char * ) и т.д.).). Добавьте функцию main(), которая вызывает эти функции в соответствующем порядке в последний раз. Данные являются важной частью программы, а не функцией. Это то, что облегчит шаг на С++ (и объектно-ориентированную).

Существует больше, но я не утверждаю, что отвечаю на все в одном сообщении SO.: -)

Ответ 4

Если вы справитесь с этим, я бы рекомендовал первые 3 главы Язык программирования С++ создателем С++ Bjarne Stroustrup.

В частности, "Заметки для читателя" и "Тур С++" даст вам хорошее представление о том, где/как С++ отличается от C и фокусировать ваше дальнейшее обучение. Конечно, вся книга полезна, когда она работает рядом с С++.

Интересно, что в вашей ситуации, в главе 1, Бьярне на самом деле говорит

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

Конечно, он бы, не так ли, но если вы примете его рассуждения, вам лучше всего сразу перейти на С++.

Ответ 5

Держите языки отдельно.

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

При переключении на С++ будьте готовы отучить (узнать другой, несовместимый метод) о:

  • препроцессор: на С++ вы не должны использовать препроцессор так же, как в C.
  • строки: C не имеет их
  • указатели: С++ может быть закодирован для более безопасного управления ими.

Ответ 6

Программы на С++ совершенно разные. вам лучше потратить свое время на изучение С++, чем на C-элементы, пытающиеся улучшить их для С++.

Например, даже простая программа Hello World значительно отличается:

С

#include <stdio.h>
int main(void)
{
  printf("Hello, world!\n");
  return 0;
}

С++:

#include <iostream>
int main()
{
   std::cout << "Hello, world!\n";
}

(Примеры из здесь).

Как "printf" является функцией, тогда как "cout" не является функцией, а экземпляром класса ostream.

Дополнительная информация: iostream.

Ответ 7

Вы переходите на С++, значит, считаете, что вам нужны классы или лучшие библиотеки. Это то, что я чувствую. Я также изучаю лучшие функции С++, с моим фоном C. Uptil теперь, я посмотрел на векторы в основном [кроме классов и шаблонов].

Я чувствую, что языки слишком похожи друг на друга.

думают о них совершенно отдельно.

Ответ 8

Моя догадка заключается в том, что С++, который вы будете изучать, вероятно, не будет чрезмерно объектно ориентированным, по крайней мере, это не было в моем университете. Мы запускали программы на С++ по существу как программы C.

Определенно прочитайте, как могут быть реализованы классы, а также понимание основ указателей.

Ваша обработка ввода-вывода файлов будет отличаться... вместо чтения fstream в синтаксисе реализации функций iostream.

Извлеките веб-страницы для учебных пособий на простых программах на С++... CodeProject всегда является хорошим ресурсом.

Ответ 9

Использовать структуры и указатели функций как можно больше, чтобы имитировать методы классов и абстрактные методы.

Например, если вы хотите определить транспортное средство и автомобиль, полученный из автомобиля с помощью C, вы бы напишите (извините, я не буду проверять код:-)):

struct Vehicle
  {
  void (*checkFuel)(Vehicle*);
  void (*start)(Vehicle*);
  void (*move)(Vehicle*);
  void (*stop)(Vehicle*);
  }

void start1(Vehicle* v)
  {
  v->checkFuel(v);
  printf("START!");
  }

void start2(Vehicle* v)
  {
  v->checkFuel(v);
  printf("VROOOOMM!");
  }


struct Car
  {
  Vehicule base;
  int (*klaxon)(Car*);
  }

Vehicule* newVehicule()
 {
 Vehicule* v=(Vehicule*)malloc(sizeof(Vehicule));
 v->start= start1;
 v->move=
 (...)
 return v;
 }


Car* newCar()
 {
 Car* c=(Car*)malloc(sizeof(Car));
 Vehicule* v=(Vehicule*)c;
 v->start= start2;
 v->move=
 (...)
 c->kaxon=(...)
 return c;
 }

Ответ 10

Вот несколько моментов:

1) Убедитесь, что вы владеете указателями. Сосредоточьтесь на том, как работают массивы и указатели, каковы сходства и различия между ними.

2) Лучший способ улучшить c - писать программы. Напишите столько, сколько сможете. Для стартера вы можете написать пользовательские функции для некоторых функций библиотеки. Вы можете попробовать свои силы Strcpy, strcmp, strncpy, memcpy, memmove.

3) Узнайте, как отлаживать. (Gdb действительно классный).

4) Начните с определенного стиля кодирования и попытайтесь придерживаться его.

5) Всегда снабжайте свой код значимыми комментариями.

Ответ 11

С++ ориентирован на объект, C - нет. Такие общие вещи, как сохранение кода указателя, и комментарии к функциям/методам, и понимание того, как не получить бесконечные циклы препроцессора с использованием #IFDEF.

Однако объектно-ориентированный подход часто может быть более приятным, чтобы на самом деле закодировать мышление об объектах. Поэтому вам нужно подумать о различиях в новых функциях.

Ответ 12

Стиль программирования на C и С++ полностью отличается. С++ - это объектно-ориентированное программирование, где C - это программно-ориентированное программирование. Программирование на С++ является лучшим в моделировании реальных проблем с использованием классов/объектов. Но основные понятия, такие как указатели, структуры, операторы, операторы литья, обработка данных, одинаковы в обоих. Sturctures and Classes - это схожая концепция, но не совсем... поэтому вы можете сосредоточиться на программировании с использованием структур, указателей, операторов и управления памятью, пока вы учитесь в "C"