Книга по C++ (особые требования:))
Модератор: Модераторы разделов
Книга по C++
Тем по выбору литературы по плюсам полно как на этом форуме, так и в гугле.
Тему же создал из-за того что есть требования к книге, найти поиском по требованиям будет сложно.
Требования:
0. Печатное издание, не люблю читать с монитора
1. Отсутствие "воды"
2. Отсутствие введения в программирование, т.е. объяснений что есть циклы, переменные и т.п.
3. Куча примеров
4. Объяснение сложных моментов в языке (шаблоны, наследования и т.п.)
5. Понятное и простое объяснение
PS Сформулировать все точно сразу не получилось, в будущем скорее всего буду корректировать пост.
Тему же создал из-за того что есть требования к книге, найти поиском по требованиям будет сложно.
Требования:
0. Печатное издание, не люблю читать с монитора
1. Отсутствие "воды"
2. Отсутствие введения в программирование, т.е. объяснений что есть циклы, переменные и т.п.
3. Куча примеров
4. Объяснение сложных моментов в языке (шаблоны, наследования и т.п.)
5. Понятное и простое объяснение
PS Сформулировать все точно сразу не получилось, в будущем скорее всего буду корректировать пост.
Re: Книга по C++
Герберт Шилдт - "Полный справочник по C++. 4-е издание", отвечает всем пунктам. Книга переведена очень хорошо, т.е там где термины можно переводить, их переводят, там где лучше оставить на английском, не коверкают, нерабочих примеров ещё не встречал, недоговоров тоже. Введение - как раз то что ищешь, т.е краткий обзор языка и описание различий с С.
P.S: Удобно читать даже в цифровом виде, ну, по-крайней мере на моем 23" монике ). Слева книжка, справа vim, пишешь коротенькие программки, проверяешь все-ли понял, листаешь дальше. Хотя от печатного издания не отказался бы
P.S: Удобно читать даже в цифровом виде, ну, по-крайней мере на моем 23" монике ). Слева книжка, справа vim, пишешь коротенькие программки, проверяешь все-ли понял, листаешь дальше. Хотя от печатного издания не отказался бы
Re: Книга по C++
Сразу не понравилось то что вперемешку C и C++. А так вроде довольно не плохо, объем впечатляет.
Re: Книга по C++
Не буду отрицать, посмотрел наискосок книгу.
Наверно ее и куплю, конечно, если вдруг не найду что-либо еще лучшее.
Наверно ее и куплю, конечно, если вдруг не найду что-либо еще лучшее.
Re: Книга по C++
... ну я же просил четыреста капель , а сдесь четыреста две ...
Re: Книга по C++
Там именно так. Классная книжка.
/me счастливый обладатель бумажного варианта
Спасибо сказали:
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Книга по C++
nuclear писал(а): ↑10.10.2010 02:070. Печатное издание, не люблю читать с монитора
1. Отсутствие "воды"
2. Отсутствие введения в программирование, т.е. объяснений что есть циклы, переменные и т.п.
3. Куча примеров
4. Объяснение сложных моментов в языке (шаблоны, наследования и т.п.)
5. Понятное и простое объяснение
Джефф Элджер
"C++ ++"
п4 подходит полностью. п5... ну там очень сложные вещи рассмотрены - сборка мусора в С++ это вам не ***.
что такое "цикл" там нет. воды тоже нет. куча примеров есть (в т.ч. довольно нетривиальных). на бумаге должна быть. у меня есть электронный вариант, но я сомневаюсь в его легальности.
Спасибо сказали:
Re: Книга по C++
My god... it's full of stars!...
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Книга по C++
да. только новичкам ИМХО не следует её серьёзно воспринимать (как руководство к действию) - книжка очень короткая, и многие тонкие моменты остались нераскрыты - используя идиомы от туда можно прострелить себе не только ноги, но и все выступающие части ;) Особенно веселы шуточки с памятью :)
Re: Книга по C++
Исходя из своего опыта, могу сказать, что новичок в ней просто ничего толком не поймет (:
My god... it's full of stars!...
Re: Книга по C++
Вспомнил еще одно требование к "книге мечты".
Мне не так нужно описание стандартной библиотеки классов и STL, т.е. даже совсем не нужно, так как намного удобнее смотреть такие вещи на компе. Например, из-за поиска
Больше бы хотелось чтобы были объяснены тонкие моменты, ну как например многопоточные приложения, безопасные указатели и куча других интересных вещей о которых я пока не подозреваю., но на уровне все же новичка в плюсах
Мне не так нужно описание стандартной библиотеки классов и STL, т.е. даже совсем не нужно, так как намного удобнее смотреть такие вещи на компе. Например, из-за поиска
Больше бы хотелось чтобы были объяснены тонкие моменты, ну как например многопоточные приложения, безопасные указатели и куча других интересных вещей о которых я пока не подозреваю., но на уровне все же новичка в плюсах
Re: Книга по C++
Ну, например пока C++0x не приняли, многопоточные приложения на голом С++ не напишешь, нужны либы.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Книга по C++
безопасных указателей не бывает. это только в других ЯП.
в С++ все указатели опасные.
Re: Книга по C++
Элджер,конечно, хорошо пишет, но не для новичка. Все его книги я бы порекомендовал среднему программисту.
Шилдт - хорошо, но лишнее про С (автор топика хочет С++) и про основы С++
Прата - много внимания уделено основам языка (автору топика этого не надо), но также есть довольно много примеров.
Лафоре - на мой взгляд лучшая книга для начинающего и среднего программиста С++. Основы описаны поверхостно, только для того, чтобы дальше было легче изучать, довольно хорошие примеры, хорошо описаны тонкости реализации ООП на С++, и параллельно идёт описание UML, что очень хорошо позволяет понять проектирование приложений.
Страуструп - несомненно лучший справочник для среднего и ПРО.
Шилдт - хорошо, но лишнее про С (автор топика хочет С++) и про основы С++
Прата - много внимания уделено основам языка (автору топика этого не надо), но также есть довольно много примеров.
Лафоре - на мой взгляд лучшая книга для начинающего и среднего программиста С++. Основы описаны поверхостно, только для того, чтобы дальше было легче изучать, довольно хорошие примеры, хорошо описаны тонкости реализации ООП на С++, и параллельно идёт описание UML, что очень хорошо позволяет понять проектирование приложений.
Страуструп - несомненно лучший справочник для среднего и ПРО.
Re: Книга по C++
А по-моему, только более-менее узнав С, человек может понять, что С++ в 99.99% случаев ему не нужен...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
Re: Книга по C++
Холив ару не поддамся.
Я не против С или С++, я про то что топикстартер хочет изучить С++.
Самому последнее время приходится писать на С.
-
- Сообщения: 1450
- Контактная информация:
Re: Книга по C++
Много задач хорошо ложатся на ООП и хорошо пишутся на C++. На С моск нужно вывихнуть что бы их написать.
Системные задачи - да, согласен с процентами.
Re: Книга по C++
Sleeping Daemon писал(а): ↑05.01.2011 15:47Много задач хорошо ложатся на ООП и хорошо пишутся на C++. На С моск нужно вывихнуть что бы их написать.
Системные задачи - да, согласен с процентами.
Пользовательские задачи тоже. Расчеты всякие, работа с железками, GUI - все это прекрасно пишется на С. Для плюсов трудно найти подходящую задачу. Чтобы с толком использовать все эти объекты, наследования, перегрузку операторов и т.п.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Книга по C++
например сложные структуры данных вроде сильноветвящихся деревьев. Я видел, как это реализуется в C - сплошные преобразования void*->type->void*.
Быстрого косвенного перехода в C тоже нет, а массив указателей на функции выглядит как НЕХ несколько непонятно даже для самого кодера.
да, ещё callback функции тоже радуют в C....
Re: Книга по C++
Расчеты, работа с железками, GUI пишется даже на асме. На C++ это часто делается проще.
Но главный плюс C++ - сложные структуры данных. На C работа с ними обрастает приведениями типов и костылями.
Модульная архитектура и плагины тоже часто легче реализовываются на C++.
Re: Книга по C++
Ну, т.к. я знаю С на уровне "постольку поскольку", а плюсы вообще не знаю, то мне, ясное дело, со сложными структурами данных сталкиваться не приходилось.
// Использую С для написания прикладного софта для личного пользования или для обслуживания разрабатываемого нашей лабораторией оборудования. Т.е. фактически для того, для чего глубоких знаний ЯП вообще не нужно.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
Re: Книга по C++
если на Си нужны приведения типов и костыли, то как без них, или хотя бы только без приведения типов, обойтись в С++? или dynamic_cast и пр. уже не приведение типов? мне кажется, что если требуется дофига костылей, то это проблема не языка, а дизайна.
хотя C++ удобней Си хотя бы за наличие std::string и std::vector
No problems - just solutions!
Re: Книга по C++
Со строками в сях очень удобно работать. А вектор можно и самому сделать. Или использовать какую-нибудь библиотеку (хоть тот же GSL).
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
Re: Книга по C++
Пусть есть деревовидная структура:
И эта самая структура может содержать элементы разных типов (к примеру, распарсенный XML DOM - корневой элемент дерева - документ, в него входят элементы XML, в которые, в свою очередь, входят атрибуты, текст и другие элементы).
Для простоты и краткости реализации generateText и некоторых других методов приводить не буду.
Вот так будет выглядеть создание простенького документа XHTML (для простоты DTD и прочую ерунду упускаю):
Код достаточно естественный и вполне нормальный (если не считать отсутствия проверок на ошибки и того, что пример создан на скорую руку).
Теперь попробуем сделать то же, только на C. Здесь сразу возникает закономерный вопрос: как?
Есть разные способы. Всякие GObject и прочие объектно-ориентированные костыли для C я не рассматриваю (т.к. я их не знаю).
Можно сделать так:
Пример использования:
Пример, конечно, немного надуманный, но демонстрирует тот случай, когда в C требуются костыли, а в C++ все делается встроенными средствами.
PS. Извиняюсь за очень длинный пример и возможное наличие в нем ошибок.
Код: Выделить всё
class TreeNode
{
TreeNode* m_nextSibl;
TreeNode* m_firstChild;
pubic:
TreeNode* nextSibling(){return m_nextSibl;}
TreeNode* firstChild(){return m_firstChild;}
void insertAfterIt(TreeNode* node);
void insertChild(TreeNode* node);
virtual string generateText()=0;
~TreeNode();
};
И эта самая структура может содержать элементы разных типов (к примеру, распарсенный XML DOM - корневой элемент дерева - документ, в него входят элементы XML, в которые, в свою очередь, входят атрибуты, текст и другие элементы).
Код: Выделить всё
class DomDocument : public TreeNode
{
public:
DomDocument();
DomDocument(string fileNameToParse);
void saveToFile(string fileName);
string generateText();
};
Код: Выделить всё
class DomElement : public TreeNode
{
string m_name;
public:
DomElement(string name):m_name(name){}
string generateText();
};
Код: Выделить всё
class DomAttr : public TreeNode
{
string m_name,m_val;
public:
DomAttr(string name,string value):m_name(name),m_value(name){}
string generateText();
};
Код: Выделить всё
class DomText : public TreeNode
{
string m_text;
public:
DomText(string text):m_text(text){}
string generateText();
};
Для простоты и краткости реализации generateText и некоторых других методов приводить не буду.
Вот так будет выглядеть создание простенького документа XHTML (для простоты DTD и прочую ерунду упускаю):
Код: Выделить всё
DomDocument* doc=new DomDocument;
DomElement* html=new DomElement("html");
DomElement* head=new DomElement("head");
DomElement* title=new DomElement("title");
DomText* titleText=new DomText("Заголовок");
title->insertChild(titleText);
head->insertChild(title);
html->insertChild(head);
DomElement* body=new DomElement("body");
DomElement* div=new DomElement("div");
DomAttr* align=new DomAttr("align","center");
DomText* centerText=new DomText("Hello, World!");
div->insertChild(align);
align->insertAfterIt(centerText);
body->insertChild(div);
html->insertChild(body);
doc->insertChild(html);
string docText=doc->generateText();
Код достаточно естественный и вполне нормальный (если не считать отсутствия проверок на ошибки и того, что пример создан на скорую руку).
Теперь попробуем сделать то же, только на C. Здесь сразу возникает закономерный вопрос: как?
Есть разные способы. Всякие GObject и прочие объектно-ориентированные костыли для C я не рассматриваю (т.к. я их не знаю).
Можно сделать так:
Код: Выделить всё
struct TreeNode
{
TreeNode* nextSibling;
TreeNode* firstChild;
void(*generateText)(TreeNode*,char*);//указатель на функцию, костыль вместо виртуальных функций
void* dataPtr;//указатель на данные, специфичные для конкретного узла дерева, костыль вместо наследования
};
struct DomElementData
{
char name[100]; //Для упрощения применим строки фиксированной длины
};
struct DomAttrData
{
char name[100];
char value[1000];
};
struct DomTextData
{
char text[1000];
};
void insertChild(TreeNode* parent,TreeNode* child);
void insertAfter(TreeNode* first,TreeNode* next);
//А в реализациях этих функций обязательно понадобятся приведения типов
void DomDocumentGenerateText(TreeNode* node,char* dest);//Реализация generateText для DomDocument
void DomElementGenerateText(TreeNode* node,char* dest);//Реализация generateText для DomElement
void DomAttrGenerateText(TreeNode* node,char* dest);//Реализация generateText для DomAttr
void DomTextGenerateText(TreeNode* node,char* dest);//Реализация generateText для DomText
//Конструкторы, здесь тоже понадобятся приведения типов
//DomDocument:
TreeNode* DomDocumentConstruct()
{
TreeNode* tmp=malloc(sizeof(TreeNode));
memset(tmp,0,sizeof(TreeNode));
tmp->generateText=DomDocumentGenerateText;
return tmp;
}
TreeNode* DomDocumentConstructFromFile(const char* filename);
//DomElement:
TreeNode* DomElementConstruct(const char* name)
{
TreeNode* tmp=malloc(sizeof(TreeNode));
memset(tmp,0,sizeof(TreeNode));
tmp->generateText=DomElementGenerateText;
tmp->dataPtr=malloc(sizeof(DomElementData);
strcpy((DomElementData*)tmp->dataPtr)->name,name);
return tmp;
}
//Для остальных аналогично, поэтому реализацию приводить не буду
TreeNode* DomAttrConstruct(const char* name,const char* value);
TreeNode* DomTextConstruct(const char* text);
//Функции-члены DomDocument, здесь тоже понадобятся приведения типов
void DomDocumentSaveToFile(TreeNode* node,const char* name);
Пример использования:
Код: Выделить всё
TreeNode* doc=DomDocumentConstruct();
TreeNode* html=DomElementConstruct("html");
TreeNode* head=DomElementConstruct("head");
TreeNode* title=DomElementConstruct("title");
TreeNode* titleText=DomTextConstruct("Заголовок");
insertChild(title,titleText);
insertChild(head,title);
insertChild(html,head);
TreeNode* body=DomElementConstruct("body");
TreeNode* div=DomElementConstruct("div");
TreeNode* align=DomAttrConstruct("align","center");
TreeNode* centerText=DomTextConstruct("Hello, World!");
insertChild(div,align);
insertAfter(align,centerText);
insertChild(body,div);
insertChild(html,body);
insertChild(doc,html);
char docText[65536]
doc->generateText(doc,docText);
Пример, конечно, немного надуманный, но демонстрирует тот случай, когда в C требуются костыли, а в C++ все делается встроенными средствами.
PS. Извиняюсь за очень длинный пример и возможное наличие в нем ошибок.
Re: Книга по C++
Нет, здесь сразу возникает закономерный вопрос: зачем? В реальной жизни совершенно необязательно писать все и всегда только на C или C++.
Просто исходное утверждение
А по-моему, только более-менее узнав С, человек может понять, что С++ в 99.99% случаев ему не нужен...
на самом деле стоит чуть изменить: в подавляющем большинстве случаев, когда C/C++ является лучшим выбором для задачи, чистый C оказывается лучше C++. Или, как вариант: практически отсутствуют задачи, для решения которых именно C++ является лучшим выбором. Для каждой конкретной задачи всегда найдется что-то более удобное.
Re: Книга по C++
Лень мне ваш пример читать. Но вы, видимо, с gtk не сталкивались. А там, между прочим, ui можно загружать из XML-файла.
Фантом писал(а): ↑08.01.2011 15:11в подавляющем большинстве случаев, когда C/C++ является лучшим выбором для задачи, чистый C оказывается лучше C++. Или, как вариант: практически отсутствуют задачи, для решения которых именно C++ является лучшим выбором. Для каждой конкретной задачи всегда найдется что-то более удобное.
Согласен. Для меня лучшим выбором является С (учитывая то, что другие компилируемые ЯП я вообще не знаю и знать не хочу ).
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
Re: Книга по C++
А зря.
Сталкивался (правда, это было абсолютно упругое столкновение ). С чистым Gtk - дальше helloworld-а не пошло, немного больше сталкивался с Gtk#.
А это здесь причем? Я не говорил, что XML парсить на C плохо или неудобно. Я привел пример, который показывает, что с DOM работать в C намного менее удобно, чем в плюсах. А DOM чаще всего нужен при создании или редактировании сложных XML-документов.
Gtk для загрузки ui из XML-файла (правда, если мне не изменяет память, это уже не функция Gtk, а функция libglade), скорее всего, юзает libxml. А он работает совсем по другой схеме и более простой схеме: DOM не генерируется, а устанавливаются коллбэки, которые парсер вызывает при начале/окончании разбора документа, элементов, атрибутов и прочей ерунды.
Поэтому для вас единственная объективная причина выбора C вместо C++ является знание первого.
Как вариант интерпрерпретации данного высказывания:
Человек, изучая C, узнает о многих недостатках и сложностях и предположит, что раз C++ - это C + ООП, то он не спасает от неудобств и недостатков C, и нужно изучать что-то более современное и простое в понимании и программировании, например, Python 3.
(К сожалению, последние 50 лет показывают, что эволюция способна породить только помойку (что хорошо иллюстрируют многие вещи с долгой историей: C, C++, Linux, Windows, gcc, а также менее связанные с ПО вещи: архитектура x86, и в еще большей мере x86-64)).
Re: Книга по C++
Нет уж, спасибо. Эта дрянь мне не нужна...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка