Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.92
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
#1

Посоветуйте новичку в С++ - C++

31.07.2011, 17:04. Просмотров 7572. Ответов 126
Метки нет (Все метки)

Здравствуйте!
После школьной программы знаком с основами Паскаля, Делфи. Скоро поступлю в ВУЗ. Скорей всего буду изучать там С++. Решил немного подготовиться.
Скачал книгу Либерти (21 день).
Сейчас остановился на девятом дне. "Прошел" указатели и ссылки. Возникают большие трудности при использовании указателей и ссылок в классах. Утечки, нулевые объекты, мины замедленного действия, одним словом остались для меня непонятными.
Во-первых мне интересно - я виноват? Или это тяжелые темы для всех? Сколько вы потратили дней, чтобы полностью разобраться в этих темах? Вся сложность в них в том, что надо понимать, как записывается информация, где хранится, когда будет запускаться конструктор, copy конструктор, деструктор. Как надо использовать функции чтобы не запускать copy конструктор.
Во-вторых я хочу спросить, а надо ли мне новичку, знакомым с С++ 7 дней, разбираться в таких, как мне кажется профессиональных вещах? Может можноо обратиться к ним позже? Или дальше без этих тем не уедешь?
Тоесть основной вопрос: если остались непонятки в этих темах, можно изучать дальше, а потом вернуться к ним? Или лучше сейчас все понять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 17:04     Посоветуйте новичку в С++
Посмотрите здесь:

посоветуйте новичку в С++ - C++
Здравствуйте! Я изучаю С++. С начала я скачала книгу Либерти, но было очень трудно. Сейчас я изучаю из книги "Шилдт Г. С++ Базовый курс,...

посоветуйте литературу, новичку - C++
:help: знаю, конечно, что в разделе "важно" (но всё-таки один раз живём :beach:) эта тема уже обсуждена, но всё-таки можете посоветовать...

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

C++ новичку - C++
Доброго времени суток! У меня такой вопрос. Раньше никогда не программировал, а сейчас стало очень интересно. Могу ли я как полный ноль в...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,017
05.08.2011, 22:52     Посоветуйте новичку в С++ #101
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. то, что вы изменили переменную объекта label1 - это не ООП? Сами себе противоречите.
Не не. Речь то не об этом. Ведь можно просто знать, чтоб изменить текст надо сделать "->" Но при этом не понимать, что это значит... Я в свое время на делфу долго плевался переходя с паскаля. Именно потому, что мне первые программисты именно такие попались показавшие делфи.

Согласитесь использовать и понимать это большая разница.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.08.2011, 09:41     Посоветуйте новичку в С++ #102
Но я все-таки не понимаю, зачем все усложнять. Генерация исключения заставит читающего код запнуться и разбираться, с какой целью его сгенерировали. Ну и это явно менее эффективно, чем goto(там, если я не ошибаюсь, одна строчка на asm).
Если использовать несколько goto, тогда да, код становится крайне сложно отладить. Но одна маленькая goto'шка в некоторых случаях только улучшит читаемость и быстродействие.
Можно, конечно, использовать функции - но зачем все усложнять?
LosAngeles
Заблокирован
06.08.2011, 10:42     Посоветуйте новичку в С++ #103
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям. А с throw в этом плане всё в порядке
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 10:50     Посоветуйте новичку в С++ #104
Цитата Сообщение от diagon Посмотреть сообщение
Можно, конечно, использовать функции - но зачем все усложнять?
В примере, который я привел, использование функций все упрощает

Цитата Сообщение от LosAngeles Посмотреть сообщение
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям. А с throw в этом плане всё в порядке
Это верно, но все же не оправдывает использования исключений для выхода из циклов.
Простое правило: goto в пределах одной области видимости, не больше!

Все равно самый лучшим вариантом будут изменения на более высоком уровне, чем на уровне команд или инструкций. Серьезно, грамотный рефакторинг - это панацея
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2011, 11:04     Посоветуйте новичку в С++ #105
Цитата Сообщение от fasked Посмотреть сообщение
нуууу....
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <vector>
#include <iostream>
void some_c_function(const int *ptr, size_t nsize) {
 while (nsize--) {
 printf("%d, ", *ptr++);
 }
}
int main() {
 std::vector<int> vec = { 1, 2, 3, 4, 5 };
 some_c_function(&vec[0], vec.size());
return 0;
}
Ну, строго говоря, данный код не соответствует Стандарту, так как оный отнюдь не требует, чтобы вектор был реализован непременно в виде массива.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 11:15     Посоветуйте новичку в С++ #106
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, строго говоря, данный код не соответствует Стандарту, так как оный отнюдь не требует, чтобы вектор был реализован непременно в виде массива.
Не имею под рукой текущего стандарта, (но там тоже самое написано) цитата из драфта грядущего:
23.4.1 Class template vector [vector]
A vector is a sequence container that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
Так что, строго говоря, данный код соответствует стандарту целиком и полностью. Стандарт, конечно, не требует прямым текстом реализации в виде массива, но то, что элементы хранятся последовательно - гарантируется.
Иначе, выгоднее было бы хранить массив указателей на элементы, а не сами элементы. Манипулировать указателями быстрее. А так сохраняется совместимость с обычными массивами.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.08.2011, 11:20     Посоветуйте новичку в С++ #107
Цитата Сообщение от fasked Посмотреть сообщение
Стандарт, конечно, не требует прямым текстом реализации в виде массива
а ввиде чего еще его можно реализовать?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 11:22     Посоветуйте новичку в С++ #108
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а ввиде чего еще его можно реализовать?
Последовательно больше никак, то есть безопасно никак, это была такая плоская шутка. То есть, я имел в виду, что в тексте стандарта (по этому поводу) нет слова "массив", но есть слово "непрерывно", что подразумевает под собой использование массива.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
06.08.2011, 11:42     Посоветуйте новичку в С++ #109
Цитата Сообщение от LosAngeles Посмотреть сообщение
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям.
Это, разумеется, не так. По-крайней мере для компилятора, соответствующего стандарту. Оператор goto так же выполняет "раскрутку стека" как и throw или break, это полноценный оператор C++. Деструкторы не вызываются только при выходе из программы функциями exit() или abort().
Но это всё-равно не значит, что стоит применять goto где попало.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2011, 12:39     Посоветуйте новичку в С++ #110
Цитата Сообщение от fasked Посмотреть сообщение
Так что, строго говоря, данный код соответствует стандарту целиком и полностью. Стандарт, конечно, не требует прямым текстом реализации в виде массива, но то, что элементы хранятся последовательно - гарантируется.
Иначе, выгоднее было бы хранить массив указателей на элементы, а не сами элементы. Манипулировать указателями быстрее. А так сохраняется совместимость с обычными массивами.
В действующем Стандарте о векторе сказано буквально следующее:
A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.
A vector satisfies all of the requirements of a container and of a reversible container (given intwo tables in 23.1) and of a sequence, including most of the optional sequence requirements (23.1.1). The exceptions are the push-front and pop_front member functions, which are not provided.

Ну и несколько цитат:
Страуструп: «Стандарт не предписывает специального представления для каждого стандартного контейнера».
Джосьютис: «Однако стандарт не утверждает, что в реализации вектора должен использоваться именно динамический массив. Скорее этот выбор обусловлен ограничениями и требованиями к сложности операций».

Так что формально никто не запрещает написать компилятор, где вектор массивом не является.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
06.08.2011, 12:46     Посоветуйте новичку в С++ #111
Mr.X, Джосьютис написал это задолго до выхода C++03, но даже у него далее есть отсылка на то, что в стандарте подразумевалась непрерывность элементов вектора и что возможно в будущем это будет внесено в стандарт явно. И действительно, в C++03 это указано прямым текстом, что и процитировал fasked. Сможешь показать разумную реализацию не через массив, но так, чтобы требование непрерывности выполнялось?

Цитата Сообщение от Mr.X Посмотреть сообщение
Так что формально никто не запрещает написать компилятор, где вектор массивом не является.
В C++98 формально может и можно, хотя там ещё требования по сложности операций есть. В C++03 не знаю как.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 12:54     Посоветуйте новичку в С++ #112
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну и несколько цитат:
С. Мейерс - Эффективное использование STL. Совет 16.
Выражение v[0] дает ссылку на первый элемент вектора, соответственно &v[0] - указатель на первый элемент. В соответствии со Стандартом C++ элементы vector должны храниться в памяти непрерывно, по аналогии с массивом.
То есть, я не думаю, что автор имел в виду C++0x
Заметьте, ни я ни Майерс не говорим про массив, а лишь про непрерывное хранение элементов, то есть друг за другом, как в массиве, а не с помощью массива.

Не по теме:

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



Хотя, по Мейерсу, я должен был написать следующий вызов Си функции:
C++
1
2
3
if (!v.empty()) {
    some_c_function(&v[0], v.size())
}
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2011, 13:44     Посоветуйте новичку в С++ #113
Цитата Сообщение от fasked Посмотреть сообщение
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
Цитата Сообщение от grizlik78 Посмотреть сообщение
Mr.X, Джосьютис написал это задолго до выхода C++03, но даже у него далее есть отсылка на то, что в стандарте подразумевалась непрерывность элементов вектора и что возможно в будущем это будет внесено в стандарт явно. И действительно, в C++03 это указано прямым текстом, что и процитировал fasked.
Пардон, это изменение как-то мимо меня прошло.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 14:49     Посоветуйте новичку в С++ #114
Цитата Сообщение от asics Посмотреть сообщение
Ок. Какой для этого случая инструмент вменяемый ? goto, исключения, флаги(bool) отпадают.
Вообще-то лучше писать циклы регулярным способом: вход сверху, выход только один - снизу. Тогда не придется использовать ни goto, ни исключения. И более того, такой цикл можно без раздумий заменять на другой блок, который имеет вход сверху, выход - снизу.
А если есть выходу из середины, то без раздумий не получится - надо читать код и вникать, как цикл работает.
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
06.08.2011, 15:02     Посоветуйте новичку в С++ #115
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Вообще-то лучше писать циклы регулярным способом: вход сверху, выход только один - снизу. Тогда не придется использовать ни goto, ни исключения. И более того, такой цикл можно без раздумий заменять на другой блок, который имеет вход сверху, выход - снизу.
А если есть выходу из середины, то без раздумий не получится - надо читать код и вникать, как цикл работает.
Я все это осознаю, но спросил, если уже есть перед тобой эти вложенные циклы, как из них можно красиво выйти, именно не переписывать их по-новой, а выйти из имующихся.
Bers
Заблокирован
06.08.2011, 15:13     Посоветуйте новичку в С++ #116
Цитата Сообщение от asics Посмотреть сообщение
Я все это осознаю, но спросил, если уже есть перед тобой эти вложенные циклы, как из них можно красиво выйти, именно не переписывать их по-новой, а выйти из имующихся.
Хотя, в реально полевых условиях и не такое случается, но суть в том, что подобные ограничения - фейл. Работа с ними - костыли.

Любой костыль, это "меньшее из двух зол". ключевое слово "зло"
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 15:17     Посоветуйте новичку в С++ #117
Цитата Сообщение от LosAngeles Посмотреть сообщение
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям. А с throw в этом плане всё в порядке
Не все. Для динамических объектов деструкторы не вызываются - имеем утечки памяти.

Добавлено через 2 минуты
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, строго говоря, данный код не соответствует Стандарту, так как оный отнюдь не требует, чтобы вектор был реализован непременно в виде массива.
До сих пор требовал. В новом отменили? В версии 2003 года специально было сделано уточнение, что вектор реализуется в виде непрерывного куска памяти = ака динамический массив.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.08.2011, 15:33     Посоветуйте новичку в С++ #118
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Не все. Для динамических объектов деструкторы не вызываются - имеем утечки памяти.
а при try/catch вызываются? ну так и в чем вопрос
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
06.08.2011, 15:38     Посоветуйте новичку в С++ #119
alex_x_x, по-моему ValeryLaptev как раз про throw и говорил.

Добавлено через 1 минуту
Точнее даже про
Цитата Сообщение от LosAngeles Посмотреть сообщение
При выходе из областей видимости вызываются деструкторы для автоматических объектов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 15:53     Посоветуйте новичку в С++
Еще ссылки по теме:

Советы новичку - C++
Ребята, добрый день! Помогите в написании кода, не могу все собрать вместе. Нужно чтобы пользователь указал с клавиатуры длину массива...

Поясните новичку - C++
Компилятор ругается на программу: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;math&gt; using namespace std; int main() ...

Подскажите новичку - C++
Подскажите новичку какой интегрированной средой разработки пользоваться и как ?

Литература Новичку - C++
Подойдет ли данная книга новичку?

Подскажите новичку. - C++
Здравствуйте. Есть такой пример составил под него программу на С++ #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 15:53     Посоветуйте новичку в С++ #120
Именно! Для объекта, созданного операцией new() деструктор вызовется только при выполнении delete(). При раскрутке стека для таких объектов деструктор не вызывается.
Yandex
Объявления
06.08.2011, 15:53     Посоветуйте новичку в С++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru