| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Конструкторы и потоки |
| Автор: yorgan 10.6.2008, 17:52 |
| Подскажите плиз ссылку на хорошую статью, где подробно описано все по конструкторам (по умолчанию, с параметрами, копирования, способы вызова конструкторов, еще какие-нибудь "тонкие" места) и по потокам. Если кто-то обладает достаточными теоретическими знаниями и не прочь сам написать мануал, буду только очень благодарен! Заранее спасибо! |
| Автор: Rififi 10.6.2008, 17:58 |
http://www.ozon.ru/context/detail/id/85559/![]() |
| Автор: bsa 10.6.2008, 18:07 | ||
| yorgan, а что именно у тебя вызывает затруднение? С конструкторами все очень просто. Они вызываются при создании объекта класса. Бывает конструктор по умолчанию. Это конструктор, у которого не указываются параметры. Есть конструктор копирования - он принимает ссылку на объект того же класса. Все конструкторы с одним параметром (в т.ч. и копирования) имеют интересную особенность, они могут вызываться, если в месте инициализации объекту присваивается что-то, для чего есть конструктор или что может быть неявно преобразовано к тому, для чего есть конструктор. Чтобы это не происходило, существует ключевое слово explicit. Примеры:
|
| Автор: rrrFer 10.6.2008, 19:12 | ||
| 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() только для потоков... |
| Автор: yorgan 11.6.2008, 00:37 |
| rrrFer, Спасибо, данная книжка у меня есть, только она еще для меня сложна и времени сейчас нету изучать ее, т.к. работаю на зачет. bsa, В очередной раз СПАСИБО! rrrFer, "Повловская" у меня есть Буду разбираться... |
| Автор: rrrFer 11.6.2008, 07:44 |
| yorgan, отсторожно, у Павловской есть ошибка: на 274 странице она пишет, что в ostream определены функции seeg и tellg, на самом деле - seekp и tellp |
| Автор: yorgan 17.6.2008, 19:38 |
| Преподаватель задал еще такой вопрос: может ли быть виртуальный конструктор? Если нет, то почему? И еще спросил можно ли в конструкторе (или деструкторе) использовать виртуальные функции? Подскажите пожалуйста... ответы. |
| Автор: JackYF 17.6.2008, 20:16 |
А прочитать самому? |
| Автор: baldina 17.6.2008, 21:34 |
| yorgan, конструктор не может быть виртуальным по определению: полиморфизм включается, когда точно неизвестен тип объекта (точнее, выясняется в процессе выполнения). В конструкторе тип объекта известен всегда, уже на стадии компиляции. Из конструктора виртуальные функции технически вызывать можно, однако объект не считается полностью сконструированным и готовым для использования пока не завершился конструктор, так что в общем случае поведение при таких вызовах не определено. А вообще-то это не настолько простая тема, что бы объяснять её в двух словах, так что - книжку в руки. |
| Автор: yorgan 17.6.2008, 23:07 |
К сожалению в книжках, которые есть у меня данные аспекты не рассматриваются и никак не комментируются (в Павловской и Березеных) :( |
| Автор: bsa 17.6.2008, 23:17 |
| http://forum.vingrad.ru/books/topic-48036.html |
| Автор: xvr 18.6.2008, 11:23 | ||||
Вообще то нет, но в Borland'овском расширении С++ для Builder/Delphi - могут (только преподавателю этого не говори, не оценит
|
| Автор: bsa 18.6.2008, 11:36 | ||||
Я бы уточнил, что нужно явно указывать принадлежность таких методов классу (Base::method() или Derived::method()). |
| Автор: yorgan 18.6.2008, 15:54 | ||
Правильно ли следующее высказывание или есть что добавить?
|
| Автор: JackYF 18.6.2008, 16:00 |
| yorgan, навскидку - правильное |
| Автор: rrrFer 18.6.2008, 18:42 |
есть такая вещь как интерфейсный класс, и там мы посути тоже не знаем что создаем...однако есть такое |
| Автор: xvr 18.6.2008, 20:04 | ||||||||
При явном указании принадлежности (через :: ) виртуальности не будет не только в конструкторах и деструкторах
|
| Автор: bsa 18.6.2008, 20:24 | ||
отсюда вывод - нельзя вызывать виртуальные методы из конструктора и деструктора (если только через явное указание принадлежности классу). |
| Автор: xvr 19.6.2008, 11:32 | ||||||
Вывод неправильный - Draft 2005, 12.7 p4
|
| Автор: bsa 19.6.2008, 21:04 |
| xvr, т.е. получается, что таблица виртуальных методов обновляется прямо перед входом в тело конструктора, но после инициализации всех членов класса. А в деструкторе с точностью до наоборот - после выхода из тела деструктора восстанавливается таблица класса предка. Правильно ли я понял? |
| Автор: bsa 19.6.2008, 21:37 |
| mes, в том то и дело, что соответствует. Когда выполняется конструктор класса A, класс A1 еще не сконструировался и таблица виртуальных методов содержит указатели на методы класса А, который уже начал конструироваться, когда дело доходит до деструктора класса А, то класс А1 полностью деинициализировался и восстановил указатели на виртуальные методы класса А (ну или деструктор класса А это сделал перед входом в тело). |
| Автор: xvr 20.6.2008, 07:41 | ||
Да. (Хотя технически таблицу виртуальных методов в деструкторе восстанавливает сам деструктор при входе, а не наследник при выходе, впрочем результат одинаковый) |