![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| The Thing |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: нет Всего: 3 |
На сайте RSDN встретил такое вот сборище тестовых вопросов по Си++.
Я решил себя проверить. Вроде бы все понятно, но некоторое пытаюсь сам себе рассказать что это такое все выглядит след образом "ну это..." ! Кое чего вообще не знаю! вот хотелось бы ниже вам привести пример версий того, что как я думаю знаю. И прошу помочь мне на те вопросы которые не знаю. БОЛЬШАЯ ПРОСЬБА, ТЕ КТО НЕ ЗНАЕТ НА 100% ЧТО ТО, ЧТО ОНИ ГОВОРЯТ ИМЕННО ТАК, НИ ПИСАТЬ, НИ ФИЛОСОФСТВОВАТЬ НЕ НАДО! МЕНЯ ИНТЕРЕСУЮТ ИСКЛЮЧИТЕЛЬНО 100% ВЕРНЫЕ ОТВЕТЫ, В ТАКОМ ВИДЕ, В КОТОРОМ БЫ Я СМОГ ОТВЕТИТЬ ЛЮДЯМ НА СОБЕСЕДОВАНИИ! Вопросы возникли в следующих пунктах: 2,3,4,9,30,31,33,34,35,40,41,42,44,45,46,47,49 Пожалуйста прокомментируйте каждый из ответов на сколько они верны. Что бы мне было понятно я правильно ответил или этот вопрос просто незаметили. БОЛЬШОЕ ИСКРЕННЕЕ СПАСИБО ВСЕМ КТО ОТКЛИКНУЛСЯ!
Добавлено @ 17:23 на 33. Может быть в случаях перегрузки операторов присваивания и тому подобное... когда нужно вернуть не указатель а сам объект. -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
||||
|
|||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
делать нечего
Гы -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
9 - тоже не знаю, расскажите плиз
20 - не уверен, расскажите плиз 22 - неверно, если например объект будет размещен при помощи new 23 - непонятно что значит "пустой объект", если объект класса без членов, то размер не определен 24 - неверно, для виртуальных методов создается таблица виртуальных функций 26 - не помню, подскажите |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Гм... на 26-ой:
. ? : sizeof & (взятие адреса) :: Вроде все. Но за достоверность не ручаюсь. Добавлено @ 18:20 4. Возвращать как результат - конечно можно, почему нет? 21. Имхо не очень верно. Как правильно - в книги. 22. Верно. Какая разница, где выделен объект? Место под него отводится того же размера. 30. Есть небольшая разница... если бинарная операция перегружена как объект класса, то она будет вызвана, только если левый операнд является объектом этого класса. В случае внешней перегрузки возможен вызов функции, если левый операнд приводится к классу объекта (для которого перегружена операция). 32. Да, ссылку на объект. 33. ... и различаются возвращаемые значения (и их тип тоже). В одном случае - ссылка, в другом - константная копия. |
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
спорно, я имел в виду sizeof(имя_объекта_класса), но ведь класс может иметь динамические данные, не знаю как в этом случае считать, их размер входит в размер объект класса, я думаю да, тогда sizeof не поможет. 100% гарантию дают только в морге |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Если класс имеет динамические данные, то никто, кроме метода данного класса типа "unsigned int capacity()"(если его, конечно, написали предусмотрительные программисты) не сможет узнать, сколько же в памяти занимает объект.
P.S. Разве что rtl. |
|||
|
||||
| skyboy |
|
||||||||||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
можно и передавать, и возвращать. в обоих случаях - по ссылке("по ссылке" == "по указателю"; есть два варианта: "по ссылке" и "по значению"). впрочем, можно повыпендриваться и заявить, что в .NET - вариации С++ есть __value классы, которые могут передаваться/возвращаться и по ссылке, и по значению.
не уверен на 100%(не я терминологию придумывал - порой она кажется мне нелогичной), по-моему это "композиция"
нет наследования(описать в одной структуре поля, а в другой структуре просто дополнить), полиморфизма(две разнотипные структуры - это две разнотипные структуры; в ООП же можно объект класса-потомка использовать вместо объекта класса-родителя) и инкапсуляции(нет областей видимости). в принципе, нет методов. можно реализовать в виде хранения адреса функции, но указатель на this автоматически передаваться не будет - работа будет явной и довольно некрасивой. А есть ещё protected: доступ только для классов-потомков. не просто отделение. сокрытие реализации. отделить интерфейс от реализации - это выделить метод "сложить" и методы, которые использует метод "сложить", "получить первое слагаемое"/"получить второе слагаемое". А сокрытие - когда мы ко всему ещё и скрываем методы "получить первое слагаемое"/"получить второе слагаемое" в private/protected-секцию, чтоб никто, кроме нас, даже не догадывался оих существовании. сильно желательно. принцип инкапсуляции - это не догма, потому сильно всё зависит от конкретной задачи и конкретных условий.
Метод - это функция, имеющая доступ ко всем данным, хранящимся в объекте и другим методам этого объекта(объект - как конкретная реализация класса). "Метод вызывается" - офигенная фраза. имеется в виду внутренний механизм(всякие таблицы динамических/виртуальных методов; inheritable и прочее) или синтаксис вызова методов? я улыбаюсь с вопрошающего.
"вне класса" - это, по всей видимости, делегирование(механизм такой).
зависит от компилятора.
в пределах метода класса - это указатель на объект, вызвавший свой метод. в других местах "this", скорее всего, вызовет сообщение об ошибке. объект класса-потомка может выступать, как объект класса-родителя. |
||||||||||||
|
|||||||||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет методов? Нет наследования? Ты когда последний раз со структурами работал?
Гм. По стандарту можно. И покажи мне компилятор, в котором нельзя. Добавлено @ 18:40 P.S. BC3.1 компилятором не считаю. |
|||
|
||||
| nerezus |
|
||||||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
|
||||||||
|
|||||||||
| Earnest |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Я думаю, как раз наоборот. Объявляется именно указатель на класс (т.к. это тип). А вот инициализируется он указателем не объект. Мы пишем: CMyClass* ptr. Где тут объект? Можно возвращать как результат, если есть явный или неявный конструктор копирования. То же самое при передаче объекта по значению.
Это включение (embedding). и struct тоже.
Инкапсюляция - это, буквально, сокрытие. Т.е. скрытие ненужных подробностей (деталей реализации) от клиентов. По принципу: меньше знаешь - крепче спишь. Отделение интерфейса от реализации - это немного другое. Ничего они не гарантируют, а только обещают. Другими словами, константность - это выражение намерений. Да, компилятор будет ругаться при попытке что-то изменить в константном методе, но это легко обойти. И кроме того, есть слово mutable. Т.о. константный метод обещает, что логическое состояние объекта не изменится. (не путать с физическим, т.е. с изменением памяти, что вполне может быть).
Полиморфизм означает, что один и тот же интерфейс может приводить к разным действиям (вызовам разных функций). Кроме того "во время выполнения программы" - это только один вид полиморфизма, динамический. Есть еще статический, или полиморфизм времени компиляции, что в С++ реализуется шаблонами.
Не очень корректный вопрос. Объект может выделять для своих нужд динамическую память - ее он ведь тоже "занимает". В этотм случае никак не узнать, если не смотреть внутрь. Этот только для неполиморфных объектов. А полиморфные - как минимум 4 байта (указатель на vtable) В некотором смысле влияют: как только появляется один виртуальный метод, добавляется указатель на vtable. Числом параметров. Операции в классе имеют на один аргумент меньше, т.к. есть неявный левый аргумент this.
Ссылку на себя. Т.е. *this. Чтобы можно было писать a = b = с = 4, как со встроенными типами. Правда, это не требования стандарта, а только рекомендации "кошерного" программирования. Если ты напишешь по-другому (вернешь void, например), компилятор проглотит.
Может. Объект класса как раз создать можно (в функции-члене класса). И такой прием применяется, например, в реализации паттерна "синглетон". А вот возможность наследования это обрубает - если нет ни одного не-private конструктора. Дальше не читала. -------------------- ... |
||||||||||||||
|
|||||||||||||||
| Fazil6 |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
думаю в виду имеется совсем не это. Композиция здесь имеется в виду. Это, кстати, и есть ответ на вопрос №9 Добавлено @ 20:00
интересно увидеть как выглядит объявление указателя на объект
ответы протеворечат друг другу. Если структура является классом (что верно), то почему этого слова не в ответе? |
||||||
|
|||||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Нет, не-explicit конструктор , который может быть вызван с одним аргументом (причем другого типа иначе какое это преобразоване). Сюда же относится конструктор со многими аргументами, если все кроме одного заданы по-умолчанию.
operator TYPE() const { retun ...; } Причем const желателен, но не обязателен. Зачем нужен... Для неявного преобразования. Скажем, есть функция Func, которая принимает int, и есть объект a класса, который приводится к int. Тогда можно написать Func(a). Оператор преобразования - в некотором смысле обратен конструктору с одним аргументом: если нужно привести к встроенному типу, работает только оперетор преобразования. Если наоборот, встроенный тип нужно привести к пользовательскому, работает конструктор. Пример: функтия void MyFunc (const CMyClass&); если CmyClass имеет не-explicit конструктор с аргументом int, можно запросто написать MyFunc(5); Если требуется преобразование между пользовательскими типами, то одинаково работают оба метода. Нет, объявить конструктор explicit. Это относится только к конструкторам, описанным в п 46 - остальные и так не могут работать как преобразователи.
Неопределенность. Это в лучшем случае, т.к. ее выявит компилятор. А в худшем, будет сделан вовсе не тот вызов, который ты, возможно, имел в виду. -------------------- ... |
||||||
|
|||||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
эти операции как раз перегружать можно. Полььзователь не может определить: - точка(выбор члена) - :: (разрешение контекста) - .* (выбор через указатель на член) перегружать их нельзя потому, что первый операнд у них имя, а не значение. Нельзя перегрузить условный оператор ? Нельзя перегрузить операторы sizeof и typeid Также не рекомендуется перегружать &&, || и запятая потому, что невозможно полностью реализовать семантику встроенных аналогов |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
Конструктор - это функция-член имя, которой совпадает с именем класса. Вотличие от метода конструктор не возвращает значение, не может быть виртуальным(вообще не действует в конструкторах), может содержать список инициализации, не может быть статическим. Думаю, можно при желании и еще отличия найти. explicit опять же. Это сообщение отредактировал(а) Fazil6 - 14.2.2007, 23:28 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |