[Рекомендация] Отличная книжка по С++

nikola1956


Читается легко. За три дня осилил почти половину, около 500 стр. Книга хорошо переведена (что, думаю, является редкостью для компьютерной литературы) и написана очень обстоятельно.
Из всей литературы по языку С++, которую я смог просмотреть в интернете и книжных магазинах, эта книга мне показалась самой продуманной и качественной. :)

nikola1956

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

PooH

такое ощущение, что ты только учишься программированию
начиная с какого-то момента становится практически без разницы на чем писать (есть какие-то предпочтения и странности конкретного языка) и основными сложностями становятся алгоритмы, архитектура и разборки в 3rd-party API
PS "на чем писать" - имеются в виду более-менее высокоуровневые языки общего назначения: C#, Java, C++, D, PHP, JS

nikola1956

Нет, не согласен, разница в сложности огромна! На PHP может читать и писать даже школьник, на Java — студент, на Scalа и Haskell — лицо с высшим образованием, а на С++ — многоопытный программист, который имеет обширные знания в низкоуровневой системной области.

zorin29

начиная с какого-то момента становится практически без разницы на чем писать
Настоящий программист может писать на FORTRAN-е на любом языке!

6yrop

архитектура
А что это?
Такое ощущение, что только учишься создавать программные системы.

6yrop

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

nikola1956

в наше время все студенты писали на C++
Тоже писал на С++, когда был студентом. Но на своем опыте убедился, что чрезмерная сложность этого языка может вызвать у студента отвращение от программирования вообще. Думаю, во время обучения лучше все-таки идти от простого к сложному, от Java (или Haskell) к С++, чтобы сначала освоить главное — проектирование, рефакторинг, мышление в терминах предметной области, навык выражения решения задачи в терминах ООП или ФП, а затем уже копаться в сложных и многообразных низкоуровневых деталях, которыми занят С++.

apl13

На лиспе еще.

Maurog

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

Anturag

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

PooH

может быть без разницы в том плане, что задачу ты хоть как-то сможешь решить на любом из перечисленных языков. однако уверен, что решение будет черезжопным для данного языка.
ну ок
просто по своему опыту:
20% времени уходит на административный аспект (проверить трекер, посмотреть последние изменения в гите, пообщаться по поводу текущих задач команды, раздать задания, проверить выполненные)
40% времени уходит на разработку без кода (проектирование классов, уточнение требований, исследование)
20% времени уходит на написание кода не на основном языке (GLSL, JS, внутренний скриптовый язык)
и остальные 20% времени уходит собственно на написание кода на C++, при этом C++ - основной язык разарботки и доля кода на нем >90%
для себя вижу, что если бы фреймворк на котором все строится работал бы на C#, Java или JS, то мне было бы по большому счету наплевать (тому же C# я бы даже порадовался, т.к. полноценный Entity System Framework на С++ это та еще шаблонная магия)
язык влияет на разработку (у каждого свои особенности и сложности но большая часть разработки вообще практически независима от языка
PS я работаю в геймдеве, поэтому все, что выше - ИМХО

apl13

40% времени уходит на разработку без кода (проектирование классов, уточнение требований, исследование)
Не по скраму! :donot:

PooH

Не по скраму!
на хую вертел скрам
на хую вертел чьи-то представления о скраме

apl13

Фу!

doublemother

к C++ не притронется даже под угрозой увольнения.
... а нахуячит всё по-быстрому на си с полусотней глобальных переменных.

6yrop

без кода (проектирование классов
как ты это делаешь без кода?

nikola1956

Многоопытный программист, который имеет обширные знания в низкоуровневой системной области, к C++ не притронется даже под угрозой увольнения.
Да, С++ страшен.
Например, кто сможет сразу увидеть ошибку в следующем коде?

#include <iostream>
#include <cmath>

using namespace std;

struct point{
double x;
double y;
};

double distance(point a, point b);

inline double sqr(double x){ return x * x; }

int main {
cout << "Координаты первой точки: " << endl;
point a;
cin >> a.x >> a.y;

cout << "Координаты второй точки: " << endl;
point b;
cin >> b.x >> b.y;

cout << "Расстояние: " << distance(a, b) << endl;
return 0;
}

double distance(point a, point b){
return sqrt( sqr(a.x - b.x) + sqr(a.y - b.y) );
}

Думаю, за такие "фокусы" многие не любят С++ :)

ppplva

using namespace std;

nikola1956

Точно! Кажется, происходит наложение одинаковых имен distance.

PooH

как ты это делаешь без кода?
с помощью псевдокода и UML

Evgeny_T

с помощью псевдокода и UML
Макконнелл одобряе!

Serab

Думаю, за такие "фокусы" многие не любят С++ :)
не за такие. Возьми вон Питон, который все любят (sic! и напиши функцию с тем же именем, что и стандартная. Тут тебе хотя бы на стадии компиляции плюнулись, а там словил бы грабли поинтереснее.
И совершенно неясно, чего ты вообще ожидал от этого кода. Ну да, если нихуя не знать, чем пользуешься (а using namespace std; внедряет конкретную такую кучу символов то как бэ чего ожидать? И неважно, что за язык.
Короче, чувак, тебе бы поучиться сперва, набраться опыта, а потом уже высказывать свои мнения. Какой смысл от того, что ты, окунув мизинец в познание плюсов, делаешь какие-то заключения? Это не продуктивно.

stm5872449

Возьми вон Питон, который все любят (sic! и напиши функцию с тем же именем, что и стандартная.
И получи тут же "shadows built-in with the same name" от пайчарма.

Serab

Это надо IDE еще ставить. Я на самом деле не знаю, ошибку в коде ТСа новые студии еще не палят так же заранее?
Ну и вообще, не знаю, зачем ты это написал. А если не builtin перекрыть, а что-нибудь из доморощенного? Легче будет?
И я не гуру питона, но там все, что в стандартной библиотеке, builtin, или есть просто функции, которые можно импортнуть с каким-нибудь модулем, а потом перекрыть?

stm5872449

builtin отдельно, остальная stdlib отдельно, так что да, перекрыть случайно импортированные стандартные функции можно. Другое дело, что писать from smth import * не принято, поэтому такую ошибку еще надо постараться сделать.
btw, читать код плюсовый, где не используется using вообще - это то еще удовольствие, в глазах рябит от std::

Serab

Я на этом не настаиваю. Вообще, тут аналогия полная, в питоне тоже можно from smth import * делать, а можно и не делать. Я о том, что надо знать, чем пользуешься. Я в cpp обычно делаю using namespace std;, в h-файлах не делаю.

nikola1956

И совершенно неясно, чего ты вообще ожидал от этого кода.
Ожидал более интеллектуального поведения компилятора, ожидал, что имя моей сущности перекроет имя библиотечной сущности (о которой я вообще могу не знать!) в случае совпадения их имен, то есть, например, как это происходит в Java-е:

...
import javax.mail.Session; // или import javax.mail.*;
...
private class Session{...} // моя сущность

private boolean sendMessage(...){
...
Properties props = new Properties;
props.put("mail.smtp.host", host );
props.put("mail.smtp.port", port );
Session session = Session.getInstance( props ); // ОШИБКА! Здесь Session -- мой класс, а не javax.mail.Session
...
}


nikola1956

Здесь собрались спецы по С++, поэтому хотел спросить, как правильно подключать большие внешние библиотеки в Eclipse CDT + MinGW? Можно ли сформулировать общую идею?
Ради тренировки пытался подключить OpenCV. Заголовочные файлы библиотеки Eclipse находит и все компилируется, но при запуске программы выдается сообщение: "Ошибка при инициализации приложения".
А в случае подключения Boost в установочном комплекте вообще отсутствуют какие-либо dll, там одни только заголовочные файлы и документация, даже файлов с исходным кодом нет! :( В общем, беда. При этом гугл выдает ссылки на крайне заумные пространные ответы, которые претендуют на решение этой казалось бы тривиальной задачи.

asvsergey

btw, читать код плюсовый, где не используется using вообще - это то еще удовольствие, в глазах рябит от std::
Никто же не мешает пользоваться using std::vector;
А using namespace аналог import * ни то ни другое не приветсвуется.

Serab

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

nikola1956

буст — это только хедеры, там больше ничего и нет
Спасибо за уточнение! Так и предполагал.
Но все-таки как можно получить конкретные dll, исходный код и вообще скомпилировать проект, использующий библиотеки boost? Неужели гуглить в поисках бинарника для нужной части boost-а? :ooo:

Serab

Но все-таки как можно получить конкретные dll, исходный код и вообще скомпилировать проект, использующий библиотеки boost? Неужели гуглить в поисках бинарника для нужной части boost-а? :ooo:
все, что есть буст, — это хедеры. Это вся его реализация, ничего больше к нему не нужно и ничего больше нет. Нет никаких «бинарников для нужной части boost-а».

spitfire

Ну если быть точным, то есть части буста, требующие вполне себе сборки и линковки с ними. Некоторые из них, как по мне, довольно-таки существенные.

Serab

я знал, что кто-то напишет. Но это переусложнение судя по вопросу ТС.

nikola1956

Благодарю вас за разъяснения!
Программа компилируется из заголовочных файлов Boost-а очень долго, со списком предупреждений, так что поначалу можно подумать, что ничего не работает и уже не дождаться окончания этого процесса:

#include <boost/math/special_functions/zeta.hpp>

inline double sqr(double x){ return x * x; }

int main {
using namespace boost::math;
const double pi = constants :: pi<double>
double result = zeta(2.0);

std::cout << sqr(pi) / result << std::endl;
return 0;
}

Чтобы это заработало, для пользователей Eclipse CDT + MinGW достаточно добавить в раздел
Свойства проекта / C/C++Build / Settings / С++Compiler / Includes путь к папке, где находится Boost.

Whoman-in-white

Ожидал более интеллектуального поведения компилятора, ожидал, что имя моей сущности перекроет имя библиотечной сущности (о которой я вообще могу не знать!) в случае совпадения их имен
ты уверен, что это более интеллектуальное поведение?

nikola1956

Ожидал более интеллектуального поведения компилятора, ожидал, что имя моей сущности перекроет имя библиотечной сущности (о которой я вообще могу не знать!) в случае совпадения их имен
------------------------------------------------------------
ты уверен, что это более интеллектуальное поведение?

Почему нет? Более привычное поведение для перешедших с Java на С++ — точно.

apl13

ты уверен, что это более интеллектуальное поведение?
Более православное. :pop:

Whoman-in-white

привычное
привычное не равно интеллектуальное же

Whoman-in-white

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

Serab

Более привычное поведение для перешедших с Java на С++ — точно.
блять чувак да ч0 за хуйня? более привычное для перешедших с Java? Отправь машину времени в 83й, чтобы там страуструпу рассказали о проблемах Java-хомячков в будущем. Ну хуй с ним с программированием, но простые-то вещи можно же одуплять.

apl13

Вы так говорите, потому что душой Вашей и сознанием овладели завистливые бесы. :umnik:

elenangel

можно же писать
using std::map;
using std::cout;
и т. д.
Оставить комментарий
Имя или ник:
Комментарий: