|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.01.2013, 18:17 | #11 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Цитата:
|
||
30.01.2013, 18:45 | #12 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Эх жалко не могу на весы... я поржал от души
Но честно Virtual не даёт оснований ваще.. для того что бы класс был абстрактным необходима хотя бы одна такая фуна Код:
Код:
____
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Последний раз редактировалось Perchik71; 30.01.2013 в 18:47. Причина: О боже сколько ошибок |
30.01.2013, 20:14 | #13 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
http://liveworkspace.org/code/1WrndV$1 рекомендую подучить тему: когда запускаются конструкторы, а когда operator= |
|
31.01.2013, 00:33 | #14 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Так у int конструктора не завезли. Более того, константы встроенного типа можно инициализировать при объявлении:
Код:
|
31.01.2013, 03:00 | #15 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Для всех прочих - за пределами класса. И если этого не сделать, объект не будет определен: http://liveworkspace.org/code/VriGX$6 Обрати внимание на текст ошибки: source.cpp.text.startup+0x2): undefined reference to `Example::val' Сущность объявлена, но не определена. Линкер нигде не нашел её определения. Следующий эксперимент показывает, что определить статический мембер в конструкторе класса невозможно: http://liveworkspace.org/code/VriGX$7 Это связанно с тем, что статический член класса не является собственностью класса. А является собственностью единиц трансляций. (Впрочем, в туловище конструктора класса в принципе нельзя определить мемберы. Даже если они и не статические. Поскольку конструкторы не_статических мемберов срабатывают в списках инициализации класса, а не в туловище его конструктора. К моменту запуска конструктора, мемберы класса будут уже построены. И у них сработает оператор=) В языке с++ действует правило РАИ: захват ресурса и есть его инициализация. Если твоими словами: определение объекта и есть его инициализация. Это справедливо для всех типов языка с++ без исключения. В том числе и для int. int так же, как и все остальные обладает конструктором. Так же, есть оговорка для типа int, связанная с наследством от языка си (который, как известно не обладает раи) Код:
(можно считать, что был запущен ничего не делающий дефолтный конструктор). А гцц 4.7.2 заполнил нулем (можно считать, что был запущен дефолтный конструктор, который по дефолту записал в память ноль) Стандарт гарантирует, что явно указанный дефолтный конструктор int() всегда вернет ноль. Но если явно не указать, какой требуется вызвать конструктор, он может ничего не сделать, и останется мусор . Однако, для любых типов языка с++ действуют единые правила. И программист вправе рассчитывать на то, что в выражении: template<class T> void Foo() { T value; //будет запуск дефолтного конструктора } Даже если это окажется "ничего не делающий" конструктор типа int |
|
31.01.2013, 10:56 | #16 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Что же до конструктора int, то, по-моему, очень хорошо об этом сказал Мейерс: в разных "частях" C++ игра идёт по чуть разным правилам. Если мы находимся в "части" ООП C++, то int можно считать вариантом класса, со своим конструктором; если мы находимся в "части" C++-как-C, то int - просто тип переменной, определение которой не влечёт никаких дополнительных действий (в соответствии с принципом C++ "не платишь за то, чего не используешь"). А RAII вроде как не возводится в принцип C++ как такового, разве нет? Это же просто идиома программирования - разработчику решать, нужно ли к ней прибегать в каждом конкретном случае. В общем случае, определение и инициализация могут быть разнесены во времени (например, при ленивой инициализации). |
|
31.01.2013, 15:19 | #17 | |||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Константный интовый статик можно определить в объявлении класса (но не в определении класса). Все прочие - за его пределами. Цитата:
Иногда бывают рантайм ошибки связанные с использованием неинициализированных переменных. Это пример не оч хорошего дизайна с++. Поэтому, в шаблончиках, при создании объекта по дефолту, лучше явно указывать: templa<class T> void Foo() { T t = t(); //гарантируем запуск дефолтного конструктора для примитивов } Современные компиляторы оптимизируют создание безымянного объекта, и копирующий конструктор. Поэтому, будет только один запуск конструктора t(); Цитата:
На плюсах создание объекта - есть запуск его конструктора. В отличие от языка си, где нужно сначала выделить память, а потом в ручную её чем то заполнить. Конечно, на плюсах тоже можно запускать функции си, типа маллоков всяких. Но в том то и дело, что это - сишные функции, а не плюсовые. |
|||
31.01.2013, 21:43 | #18 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
конструкторы можно перегружать, поэтому стоит пометить и В конструктор не всегда объявляется в public, поэтому ответ D тоже стоит отметить ответ на 4 вопрос верный, остальные не смотрел ----а вот посмотрел: Цитата:
Последний раз редактировалось rrrFer; 31.01.2013 в 21:57. Причина: добавил |
||
31.01.2013, 22:00 | #19 |
Пользователь
Регистрация: 03.11.2012
Сообщений: 89
|
|
31.01.2013, 22:20 | #20 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Тест | Sparky | Помощь студентам | 0 | 19.06.2009 19:30 |
Тест 0.5 | Лунатик222 | Софт | 0 | 03.03.2009 22:20 |
ТЕСТ | Ярослав | Помощь студентам | 14 | 18.04.2008 23:37 |
Тест | SERG1980 | БД в Delphi | 1 | 20.07.2007 12:58 |