Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/44: Рейтинг темы: голосов - 44, средняя оценка - 4.50
gore-lykovoe
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
#1

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

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

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

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

Посоветуйте книгу/-и новичку
Доброе время суток человечество! Посоветуйте пожалуйста книгу по с++ новичку,...

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

Посоветуйте новичку порядок действий
Посоветуйте новичку, в двух словах, порядок действий и название команд....

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

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

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

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

Все равно самый лучшим вариантом будут изменения на более высоком уровне, чем на уровне команд или инструкций. Серьезно, грамотный рефакторинг - это панацея
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 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;
}
Ну, строго говоря, данный код не соответствует Стандарту, так как оный отнюдь не требует, чтобы вектор был реализован непременно в виде массива.
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 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
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.08.2011, 11:20 #107
Цитата Сообщение от fasked Посмотреть сообщение
Стандарт, конечно, не требует прямым текстом реализации в виде массива
а ввиде чего еще его можно реализовать?
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 11:22 #108
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а ввиде чего еще его можно реализовать?
Последовательно больше никак, то есть безопасно никак, это была такая плоская шутка. То есть, я имел в виду, что в тексте стандарта (по этому поводу) нет слова "массив", но есть слово "непрерывно", что подразумевает под собой использование массива.
1
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
06.08.2011, 11:42 #109
Цитата Сообщение от LosAngeles Посмотреть сообщение
с goto в С++ надо быть предельно осторожным. При выходе из областей видимости вызываются деструкторы для автоматических объектов. При выходе из циклов с помощью goto никакие деструкторы не вызываются, что естественно приводит к печальным последствиям.
Это, разумеется, не так. По-крайней мере для компилятора, соответствующего стандарту. Оператор goto так же выполняет "раскрутку стека" как и throw или break, это полноценный оператор C++. Деструкторы не вызываются только при выходе из программы функциями exit() или abort().
Но это всё-равно не значит, что стоит применять goto где попало.
2
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
06.08.2011, 12:46 #111
Mr.X, Джосьютис написал это задолго до выхода C++03, но даже у него далее есть отсылка на то, что в стандарте подразумевалась непрерывность элементов вектора и что возможно в будущем это будет внесено в стандарт явно. И действительно, в C++03 это указано прямым текстом, что и процитировал fasked. Сможешь показать разумную реализацию не через массив, но так, чтобы требование непрерывности выполнялось?

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

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

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

Добавлено через 1 минуту
Точнее даже про
Цитата Сообщение от LosAngeles Посмотреть сообщение
При выходе из областей видимости вызываются деструкторы для автоматических объектов.
1
ValeryLaptev
Эксперт С++
1050 / 829 / 60
Регистрация: 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

Ответьте новичку
Здравствуйте! Собственно, есть пара вопросов, на которые я был бы рад получить...

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

Подскажите новичку.
Здравствуйте. Есть такой пример составил под него программу на С++...


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

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

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