![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Подскажите плиз ссылку на хорошую статью, где подробно описано все по конструкторам (по умолчанию, с параметрами, копирования, способы вызова конструкторов, еще какие-нибудь "тонкие" места) и по потокам.
Если кто-то обладает достаточными теоретическими знаниями и не прочь сам написать мануал, буду только очень благодарен! Заранее спасибо! |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
yorgan, а что именно у тебя вызывает затруднение?
С конструкторами все очень просто. Они вызываются при создании объекта класса. Бывает конструктор по умолчанию. Это конструктор, у которого не указываются параметры. Есть конструктор копирования - он принимает ссылку на объект того же класса. Все конструкторы с одним параметром (в т.ч. и копирования) имеют интересную особенность, они могут вызываться, если в месте инициализации объекту присваивается что-то, для чего есть конструктор или что может быть неявно преобразовано к тому, для чего есть конструктор. Чтобы это не происходило, существует ключевое слово explicit. Примеры:
|
|||
|
||||
rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
yorgan,
если под потоком имеется ввиду процесс то вот - присоединяю файл(там очень вкратце написано) если же под потоками имеются ввиду вообще потоки, то можно прочитать в книжке Павловской "программироание на языке высокого уровня" -гугли. Там написано крайне просто и понятно. Вообще поток можно видеть как класс с определенными для него функциями. Также поток представляет собой файл, и определенные функции позволяют работать с этим файлом: записывать в него и считывать... Классы потоков имеют конструкторы(как и любой нормальны класс вообще). Для файловых потокв: если поток входной то конструктор ifstream, выходной ofstream, двунаправленный - fstream. еслы вызван конструктор без параметров, то создается обьект, но с файлом он не связывается. параметры этих конструкторов: имя файла char *, и режим открытия файла, второй параметр можно иногда опускать, т.к. по умолчанию для ifstream он определен ios::in, ofstream - ios::out|ios::trunc. режимы открытия описаны в структуре open_mode{}, т.е. trunc, например, удаляет файл если такой файл уже существует, т.е. при использовании ofstream of("out.txt"); если файл out.txt существует, то будет удален и создан заново, также часто используется ios::bynary - т.е. двоичный поток. Функции для работы с потоками(некоторые) вот: get() - возвращает символ из потока(код символа), getline(char *buffer, int num) где как можно догадаться buffer - то куда будут записываны считанные символы, num - Их количество. Аналогичная функция read(char *buffer, int num).Разница между read(...) и getlime в том, что getline помещает символ конца строки в buffer. Можно установить позицию для чтения функцией seekg(int position), узнать текущую позицию чтения потока int tellg(). - это были потоки из istream. В ostream есть вот: flush() - переписывает поток на устройство, put(char c) - записывает символ в поток, seekp(int position) - установка позиции записи, tellp() - возвращает текущую позицию, write( char *buffer, int num) - записывает в поток num символов из потока buffer. а вот маленький примерчик:
загляните в файл до вызова flush() и после - вот так оно работает. Кстати, если выкинуть flush из программы, то содержимое потока все равно перепишется в файл, также можно убрать из программы close() - все ранво закроется, и данные не будут потеряны. Предполагаю что при завершении программы вызывается что то типа fcloseall() только для потоков... Это сообщение отредактировал(а) rrrFer - 10.6.2008, 19:18 Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
rrrFer, Спасибо, данная книжка у меня есть, только она еще для меня сложна и времени сейчас нету изучать ее, т.к. работаю на зачет.
bsa, В очередной раз СПАСИБО! rrrFer, "Повловская" у меня есть ![]() Буду разбираться... |
|||
|
||||
rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
yorgan,
отсторожно, у Павловской есть ошибка: на 274 странице она пишет, что в ostream определены функции seeg и tellg, на самом деле - seekp и tellp Это сообщение отредактировал(а) rrrFer - 11.6.2008, 07:44 |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Преподаватель задал еще такой вопрос: может ли быть виртуальный конструктор? Если нет, то почему?
И еще спросил можно ли в конструкторе (или деструкторе) использовать виртуальные функции? Подскажите пожалуйста... ответы. |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
yorgan, конструктор не может быть виртуальным по определению: полиморфизм включается, когда точно неизвестен тип объекта (точнее, выясняется в процессе выполнения). В конструкторе тип объекта известен всегда, уже на стадии компиляции.
Из конструктора виртуальные функции технически вызывать можно, однако объект не считается полностью сконструированным и готовым для использования пока не завершился конструктор, так что в общем случае поведение при таких вызовах не определено. А вообще-то это не настолько простая тема, что бы объяснять её в двух словах, так что - книжку в руки. |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вообще то нет, но в Borland'овском расширении С++ для Builder/Delphi - могут (только преподавателю этого не говори, не оценит ![]()
|
||||
|
|||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Я бы уточнил, что нужно явно указывать принадлежность таких методов классу (Base::method() или Derived::method()). |
||||
|
|||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Правильно ли следующее высказывание или есть что добавить?
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
yorgan, навскидку - правильное
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |