Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

126
fasked
Эксперт С++
4974 / 2554 / 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().
Так что, строго говоря, данный код соответствует стандарту целиком и полностью. Стандарт, конечно, не требует прямым текстом реализации в виде массива, но то, что элементы хранятся последовательно - гарантируется.
Иначе, выгоднее было бы хранить массив указателей на элементы, а не сами элементы. Манипулировать указателями быстрее. А так сохраняется совместимость с обычными массивами.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.08.2011, 11:20 #107
Цитата Сообщение от fasked Посмотреть сообщение
Стандарт, конечно, не требует прямым текстом реализации в виде массива
а ввиде чего еще его можно реализовать?
0
fasked
Эксперт С++
4974 / 2554 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 11:22 #108
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а ввиде чего еще его можно реализовать?
Последовательно больше никак, то есть безопасно никак, это была такая плоская шутка. То есть, я имел в виду, что в тексте стандарта (по этому поводу) нет слова "массив", но есть слово "непрерывно", что подразумевает под собой использование массива.
1
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
06.08.2011, 11:42 #109
Цитата Сообщение от LosAngeles Посмотреть сообщение
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям.
Это, разумеется, не так. По-крайней мере для компилятора, соответствующего стандарту. Оператор goto так же выполняет "раскрутку стека" как и throw или break, это полноценный оператор C++. Деструкторы не вызываются только при выходе из программы функциями exit() или abort().
Но это всё-равно не значит, что стоит применять goto где попало.
2
Mr.X
Эксперт С++
3060 / 1705 / 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.

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

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

Цитата Сообщение от Mr.X Посмотреть сообщение
Так что формально никто не запрещает написать компилятор, где вектор массивом не является.
В C++98 формально может и можно, хотя там ещё требования по сложности операций есть. В C++03 не знаю как.
0
fasked
Эксперт С++
4974 / 2554 / 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())
}
0
Mr.X
Эксперт С++
3060 / 1705 / 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.
Пардон, это изменение как-то мимо меня прошло.
0
ValeryLaptev
Эксперт С++
1048 / 827 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 14:49 #114
Цитата Сообщение от asics Посмотреть сообщение
Ок. Какой для этого случая инструмент вменяемый ? goto, исключения, флаги(bool) отпадают.
Вообще-то лучше писать циклы регулярным способом: вход сверху, выход только один - снизу. Тогда не придется использовать ни goto, ни исключения. И более того, такой цикл можно без раздумий заменять на другой блок, который имеет вход сверху, выход - снизу.
А если есть выходу из середины, то без раздумий не получится - надо читать код и вникать, как цикл работает.
0
asics
Freelance
Эксперт С++
2854 / 1789 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
06.08.2011, 15:02 #115
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Вообще-то лучше писать циклы регулярным способом: вход сверху, выход только один - снизу. Тогда не придется использовать ни goto, ни исключения. И более того, такой цикл можно без раздумий заменять на другой блок, который имеет вход сверху, выход - снизу.
А если есть выходу из середины, то без раздумий не получится - надо читать код и вникать, как цикл работает.
Я все это осознаю, но спросил, если уже есть перед тобой эти вложенные циклы, как из них можно красиво выйти, именно не переписывать их по-новой, а выйти из имующихся.
0
Bers
Заблокирован
06.08.2011, 15:13 #116
Цитата Сообщение от asics Посмотреть сообщение
Я все это осознаю, но спросил, если уже есть перед тобой эти вложенные циклы, как из них можно красиво выйти, именно не переписывать их по-новой, а выйти из имующихся.
Хотя, в реально полевых условиях и не такое случается, но суть в том, что подобные ограничения - фейл. Работа с ними - костыли.

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

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

Добавлено через 1 минуту
Точнее даже про
Цитата Сообщение от LosAngeles Посмотреть сообщение
При выходе из областей видимости вызываются деструкторы для автоматических объектов.
1
ValeryLaptev
Эксперт С++
1048 / 827 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 15:53 #120
Именно! Для объекта, созданного операцией new() деструктор вызовется только при выполнении delete(). При раскрутке стека для таких объектов деструктор не вызывается.
0
06.08.2011, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 15:53
Привет! Вот еще темы с ответами:

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

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

Поясните новичку! - C++
Задано 6-значное число. Определить, кратно ли это число 9, используя признак делимости на 9 (число делится на 9, если сумма его цифр...

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


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Опции темы

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