Comments 177
Что такое виртуальный базовый класс?
Меня на этом 2 раза поймали, потом наконец выучил все эти «извращения» :-) Но впрочем, на работу все равно взяли
И вот хоть бы один написал что плохого я написал…
Я думаю ключевое слово «извращения», т.к. они самые иногда делают дизайн классов довольно удобным и легко изменяемым.
Они думают, что если они это знают, то они круче вас.
Не хватает вопроса про виртуальное наследование и для чего оно применяется
В чем разница между struct и class?Это не полный ответ, продолжайте.
Ответ: Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class private.
Хм, кроме наследования по умолчанию, которое тоже разное: public и private, ничего в голову не приходит, оно?
Оно :)
:) Добавил в пост
Ё-моё. И зачем этот это помнить? Лично у меня RAM ограничено :)
Ну если вы не пользуетесь наследованием или не ленитесь всегда писать access-specifier — то помнить, в общем то, незачем*.
* При условии, что вы только пишете, но не читаете код**.
** Чужой код.
* При условии, что вы только пишете, но не читаете код**.
** Чужой код.
Честно говоря не очень понимаю как можно уж в этом-то случае лениться? И что, так часто приватно наследуются?
Вообще, наличие двух сущностей не отличающихся практически ничем — имхо бред, и лучше было бы если было бы только одно из них. И вопросов бы дурацких не было ;) и когда пишешь форвард думать не надо было бы, struct оно или class.
Вообще, наличие двух сущностей не отличающихся практически ничем — имхо бред, и лучше было бы если было бы только одно из них. И вопросов бы дурацких не было ;) и когда пишешь форвард думать не надо было бы, struct оно или class.
Вообще, наличие двух сущностей не отличающихся практически ничем — имхо бредЭто не бред, это для совместимости с Си.
А для форвардов и так всё равно:
class A;
void foo(A*);
struct A
{
int i;
};
void foo(A*)
{
}
Comeau, VC2010 и g++ 4.4.0 это компилируют.Да оно понятно что для совместимости, бредом от этого оно быть не перестаёт :) Зачем было растягивать сишный struct до си++ class? Оставался бы себе сишной структурой, без функций, наследования и т.п., было бы чище. А плюсовых вропперов добавлять по необходимости.
У меня в студии ворнинги насчёт форвардов struct/class, наверное зависит от опций.
У меня в студии ворнинги насчёт форвардов struct/class, наверное зависит от опций.
Я давненько не писал на сях но, разве struct может содержать реализацию функций?
Тогда бонусом чем POD структура отличается от не POD.
9. Сколько в памяти занимает произвольная структура?
Ответ: sizeof всех членов + остаток для выравнивания (по умолчанию выравнивание 4 байта) + vtable (если есть виртуальные функции)
9.1 Сколько в памяти занимает структура без членов?
struct Empty{};
assert(x == sizeof(Empty));
1 байт. Не помню почему, но есть подозрение, что размер принудительно выставляется в 1 т.к. фактически там все равно ничего нет, в просто Си, вроде, вообще нельзя объявлять пустые структуры.
Не подскажите в чем соль? стандарт?
Не подскажите в чем соль? стандарт?
А случайно не равно sizeof(char)? :-)
То бишь минимальная единица памяти в системе.
sizeof(char) == 1 всегда (5.3.3/1).
А вот sizeof пустого класса не определён, но должен быть >0.
А ещё с пустыми классами есть такой забавный момент:
sizeof( C ) в этом случае может быть 1.
А вот sizeof пустого класса не определён, но должен быть >0.
А ещё с пустыми классами есть такой забавный момент:
class A {};
class B {};
class C: public A, B {};
sizeof( C ) в этом случае может быть 1.
Помогает не схватить division by zero в таких распространенных случаях
struct Foo{};
struct Foo{};
Есть еще один фактор, влияющий на размер. Виртуальное наследование.
class A {int a};
class B: virtual public A {};
класс B хранит int + указатель
class B: virtual public A {};
класс B хранит int + указатель
А если точнее, то размер класса увеличивается на не более чем (размер указателя)*(количество классов в иерархии наследования, у которых непосредственно есть виртуальный предок). Эти объекты хранят указатель на таблицу виртуальных классов. Для классов без членов компилятор может провести оптимизацию и уменьшить вышеприведенное значение.
19. Что стоит учитывать при использовании auto_ptr?
Вы забыли про
std::auto_ptr p(new char[20]);
> 18. В чем различия между delete и delete[]?
я б добавил бы, что если будет использоваться delete вместо delete[], то будет вызван деструктор первого обьекта массива, а остальных обьектов не будет вызываться.
я б добавил бы, что если будет использоваться delete вместо delete[], то будет вызван деструктор первого обьекта массива, а остальных обьектов не будет вызываться.
если будет использоваться delete вместо delete[], то будет вызван деструктор первого обьекта массива, а остальных обьектов не будет вызываться
Если delete будет применен к чему-то, что выделено с помощью new[], то behaviour is undefined. Может быть так, как вы сказали, а может быть и по-другому. Ничего не гарантируется.
Это не так
habrahabr.ru/company/abbyy/blog/117208/ вот разбор полётов
habrahabr.ru/company/abbyy/blog/117208/ вот разбор полётов
16. Что такое чисто виртуальный метод и абстрактный класс?
Ответ: Чисто виртуальный метод — это метод, у которого отсутствует реализация. Абстрактный класс — это класс имеющий хотя бы один чисто виртуальный метод. Как следствие, экземпляр подобного класса не может быть создан т.к. отсутствует реализация виртуального метода.
Вообще-то он не может быть создан, даже если чисто виртуальный метод будет иметь реализацию. Это, кстати, тоже хороший вопрос на собеседовании — может ли чисто виртуальный метод иметь реализацию. 70% собеседуемых почему-то отвечают «нет».
А можно подробнее про реализацию чисто виртуального метода?
Давайте вместе рассуждать.
1. Может ли деструктор быть чисто виртуальным?
2. Может ли объявленный деструктор не быть определён?
1. Может ли деструктор быть чисто виртуальным?
2. Может ли объявленный деструктор не быть определён?
Может, а еще можно писать реализацию для чисто виртуальных методов и тогда она в потомках будет реализацией по умолчанию, если её не заимплементить.
Скорее всего, такая байда н е слинкуется, ну или в рантайме вывалится, если повезёт.
Скорее всего, такая байда н е слинкуется, ну или в рантайме вывалится, если повезёт.
Если в потомке чисто виртуальный метод не определить — потомок будет абстрактным классом, соответственно его даже создать нельзя будет. А вот если определить, а из него вызвать метод базового абстрактного — то всё будет ок (при условии, что он в базовом определён, конечно). Слинкуется и будет работать без выпадений.
Ну честно говоря, я особо применений этому не видел. Проще не заниматься такой магией, а то потом те, кто чуть хуже разбираются. проклянут.
Ну как минимум — это упомянутые деструкторы. Деструктор, если объявлен, обязательно должен быть определён, иначе не слинкуемся. Другой вариант — абстрактный базовый класс, но не интерфейс, а с членами-данными. У него вполне могут быть чисто виртуальные методы работы с этими данными, которыми могут пользоваться наследники.
Если пришедший на собеседывание не ответил на вопрос, что такое инкапсуляция или полиморфизм, или не сумел написать сортировку пузырьком — пинок под жопу и пусть катится. Не нужны такие программисты.
Вам часто приходилось по работе писать сортировку пузырьком?
Регулярно приходится.
Не для релизного кода (там уже qsort есть), а скорее для «служебных целей».
Периодичность? Ну раз в месяц наверное. Три строчки кода — проще написать заново, чем таскать либы.
Не для релизного кода (там уже qsort есть), а скорее для «служебных целей».
Периодичность? Ну раз в месяц наверное. Три строчки кода — проще написать заново, чем таскать либы.
Расскажите пожалуйста, зачем нужно для служебных целей писать пузырьковую сортировку, когда в стандартной библиотеке есть qsort и std::sort? Что и куда надо таскать?
Извините, я не указал, что я пишу на Java ME. Просто подумал, что программист, который не может написать сортировку пузырьком — это все равно что математик, забывший как считается дискриминант квадратного уравнения.
Ну это было неочевидно в контексте топика про С++. Что до пузырьковой сортировки — я не утруждаю себя запоминанием даже алгоритма её и постоянно путаю с сортировкой вставками. Позволяю я себе такое только потому, что знаю, что реализовывать мне её никогда не прийдется.
А для практических заданий есть намного более раскрывающие знания задачи, чем реализация пузырьковой сортировки, которую можно тупо зазубрить.
А для практических заданий есть намного более раскрывающие знания задачи, чем реализация пузырьковой сортировки, которую можно тупо зазубрить.
Тут прикол в том, что не всегда быстрая сортировка является лучшим вариантом. Например, к отсортированному массиву изредка добавляется новый элемент. Куда эффективнее сделать сортировку вставкой (можно с бинарным поиском места вставки). Или если возможность применить цифровую сортировку. Или слиянием будет лучше (сортировка на распределённой системе). Поэтому «реализовывать никогда не придётся» — звучит мега странно.
Во-первых, «реализовывать никогда не прийдётся» относилось именно к пузырьковой сортировке. В топике задание звучит «написать пример какого-нибудь алгоритма сортировки». Какой-нибудь напишу, но это будет не пузырёк :) А началась эта ветка комментариев именно с высказывания
Если пришедший на собеседывание ... не сумел написать сортировку пузырьком — пинок под жопу и пусть катится. Не нужны такие программисты.с которым я категорически не согласен.
Ну, я тогда дополню, что правильным ответом, должен быть вопрос: что надо отсортировать, что представляет собой система, на которой надо производить сортировку. А иначе как-то странно выглядит — сортируем неизвестно что неизвестно как.
Насчёт конкретно сортировки пузырьком я тоже согласен. Но вот если программист не представляет алгоритм ни одной из сортировок. То тут действительно стоит задуматься — нужен ли он.
Насчёт конкретно сортировки пузырьком я тоже согласен. Но вот если программист не представляет алгоритм ни одной из сортировок. То тут действительно стоит задуматься — нужен ли он.
Никогда ещё не приходилось :) Всюду есть реализация быстрой сортировки.
Но, сортировка пузырьком — это настолько элементарная вещь, что просто стыдно не знать.
Тут даже речь не о том, чтобы что-то помнить. Главное — понять суть, а потом, когда понадобится, можно воссоздать.
Если человек не утруждается пониманием основ, это говорит о поверхностных знаниях предмета. А также о том, что он не любит учиться.
Но, сортировка пузырьком — это настолько элементарная вещь, что просто стыдно не знать.
Тут даже речь не о том, чтобы что-то помнить. Главное — понять суть, а потом, когда понадобится, можно воссоздать.
Если человек не утруждается пониманием основ, это говорит о поверхностных знаниях предмета. А также о том, что он не любит учиться.
Скажу честно, пузырьковая сортировка для меня нелогична. Если простая, то напишу вставкой или выбором — намного более понятные с точки зрения логики. А пузырёк, наверное проще зубрится. А так вообще есть прекрасные алгоритмы быстрой сортировки и деревом. Да, лично мне быструю написать (с нуля) проще, чем пузырёк.
UFO just landed and posted this here
12. Что дают разные модификаторы при наследовании?
Ответ: Изменяют зону видимости членов базового класса.
Более точный ответ: изменяют зону видимости интерфейса базового класса (а не только членов).
То бишь, при private наследовании только объекты дочернего класса знают о функционале базового класса (public и protected членах/методах), при protected — информация распостраняется и дальше при наследовании, при public наследовании интерфейс базового класса становится доступен за пределами объекта (только public члены/методы). Это же правило распостраняется на преобразование к базовому классу (static_cast<>).
И, если не считать виртуальных методов, private/protected наследование мало чем отличается от обычного private/protected члена.
Ответ: Изменяют зону видимости членов базового класса.
Более точный ответ: изменяют зону видимости интерфейса базового класса (а не только членов).
То бишь, при private наследовании только объекты дочернего класса знают о функционале базового класса (public и protected членах/методах), при protected — информация распостраняется и дальше при наследовании, при public наследовании интерфейс базового класса становится доступен за пределами объекта (только public члены/методы). Это же правило распостраняется на преобразование к базовому классу (static_cast<>).
И, если не считать виртуальных методов, private/protected наследование мало чем отличается от обычного private/protected члена.
3. Для каких целей применяется ключевое слово const?
Ответ:
Позволяет задать константность объекта
Позволяет задать константность указателя
Позволяет указать, что данный метод не модифицирует члены класса, т.е. сохраняет состояние объекта
Спецификатор const означает «только для чтения».
Думаю, будет полезно ещё почитать статью на http://chipenable.ru. Там вопросы по Си, но для С++ тоже можно почерпнуть.
Атас. Всё, что мы обычно спрашиваем. Ещё кое-что:
Почему basic_string не имеет оператора приведения типа к
Почему basic_string не имеет оператора приведения типа к
operator const value_type *() const;
а вместо этого есть:
<source lang="cpp">
const value_type *c_str( ) const;
6. Как защитить объект от копирования?Так вы защититесь только от копирования извне, но сможете копировать в членах класса. Нужно не просто делать их приватными, но ещё и оставлять без реализации.
Ответ: Сделать private конструктор копирования и оператор =.
А потом добрый дядя в любом cppшнике накатает реализацию ;)
6. Как защитить объект от копирования?
Ответ: Сделать private конструктор копирования и оператор =.
Так вы защититесь только от копирования извне, но сможете копировать в членах класса. Нужно не просто делать их приватными, но ещё и оставлять без реализации.
В членах и friend'ах.
> 10. Как сгенерировать pure virtual function call исключение?
Граблями по лбу! А вот расскажите как сделать так, чтобы обойти эту проблему, а? ;)
Ещё сколько раз твердили миру, что исключения в конструкторах и деструкторах это злоЪ. Если я хочу породить объект он должен обязательно создаться и если я хочу его убить, он должен убиться. А уж будет ли он валидным — это другой вопрос.
Граблями по лбу! А вот расскажите как сделать так, чтобы обойти эту проблему, а? ;)
Ещё сколько раз твердили миру, что исключения в конструкторах и деструкторах это злоЪ. Если я хочу породить объект он должен обязательно создаться и если я хочу его убить, он должен убиться. А уж будет ли он валидным — это другой вопрос.
Это вечный холивар. Если вы не хотите создавать объект в два этапа — иначе как бросив исключение из конструктора об ошибке не сообщишь. Ничего плохого в выбрасывании исключений из конструктора нету, если писать exception-safe код.
И в общем то «pure virtual function call исключение» — это не С++ исключение, которое вы не любите бросать из конструкторов. В случае pure virtual function call будет UB, обычно это аварийное завершение программы.
Знамо как обойти эту проблему — вызывать всякий стрёмный код из методов Initialize(). Вот только их нужно не забывать вызывать да во всех остальных методах проверять, был вызван Initialize() или нет. Ну или не исключения бросать в конструкторе, а выставлять какой-нибудь флаг в FAIL и разными getlasterror() его проверять. Первый подход использует COM, второй — iostream. И там и там свои плюсы и минусы.
Миру твердят про деструкторы только, пускать исключения из конструктора это вопрос стиля и однозначного мнения по этому поводу нет. Т.к. исключение в конструкторе не может натворить того, что может натворить исключение в деструкторе.
UFO just landed and posted this here
переопределить new и закрыть конструктор в private?
UFO just landed and posted this here
typedef Foo void?
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Деструктор скрыть. А для уничтожения добавить открытый метод destroy, который и вызовет этот деструктор «изнутри».
Сделать приватный деструктор?
Из странного… :)
А вот это скомпилируется?
long static int long unsigned const __w64 zzz;
А почему?
А вот это скомпилируется?
long static int long unsigned const __w64 zzz;
А почему?
2. Что стоит помнить при использовании исключений в конструкторе объекта?
Я бы еще добавил, что деструкторы будут вызваны для всех созданных членов класса.
Я бы еще добавил, что деструкторы будут вызваны для всех созданных членов класса.
еще многие не знают, чем C от C++ отличается. может имеет смысл поспрашивать? Думают, что только классы появились. Об отличиях в структурах или объявлении переменных не догадываются.
А как же мясо с указателем на void? :-) В С++ типизация более строгая.
Один из вопросов в плане отличий — напишите программу на С, которая не скомпилируется компилятором С++. K&R style parameters не считаются — это рудимент даже в С.
int class;
// main.c
main() /* poor style C. Not C++ */
{
double sq2 = sqrt(2); /* call undeclared function */
printf("the square root of 2 is %g\n", sq2); /* call undeclared function */
}
Найдёте 2-е ошибки?
Они ж подписаны? Или там кроме них есть ещё 2 ошибки?
Подписаны C/C++ incompatibilities. Этот код компилируется С99 компилятором, но содержит 2-е ошибки. Чем не вопрос на собеседовании?
Я, честно говоря, С знаю плохо. Сначала я думал, что ошибки в том, что для необъявленных функций будет работать правило implicit int, но я скомпилировал и корень посчитался и вывелся верно. Если собирать с --std=c89, то программа возвращает не 0, это тоже можно считать ошибкой. Но с --std=c99 возвращается 0, так что я даже не знаю.
Не поправка, но добавление к 20.
При упоминании volatile чаще всего вспоминают многопоточность. Яркий пример — из одного потока отслеживается состояние некого объекта/флага/переменной другого потока.
При упоминании volatile чаще всего вспоминают многопоточность. Яркий пример — из одного потока отслеживается состояние некого объекта/флага/переменной другого потока.
А также если периферия пишет в данный участок памяти, то значение volatile переменной может меняться извне. Volatile подсказывает компилятору не делать предположений о текущем значении переменной (а значит — и не применять оптимизацию)
Volatile и многопоточность — не очень хорошая практика. По крайней мере в C++. Для многопоточности есть специальные высокоуровневые примитивы, в частности atomic.
11. В чем отличие vector от deque?
…
но зато у deque операция вставки в произвольное место быстрее (O(1) против O(n)), ввиду того, что не нужно перемещать остальные значения.
Неверно. Дек имеет АМОРТИЗИРОВАННОЕ константное время вставки/удаления только в начало и конец (а не в произвольное место — этим отличается от листа). Это легче понять, если вспомнить, что наиболее частая реализация дека, отвечающая требованиям стандарта, — кольцевой буфер.
20. Для чего используется ключевое слово volatile?
Ответ: Для указания компилятору о том, что данную переменную не нужно оптимизировать.
Неверно. Это указание компилятору, что доступ к переменной может осуществляться из мест, неподконтрольных ему. Одно из следствий — запрет размещения в регистрах, перевыделения памяти под другие переменные и части других оптимизаций (но не запрет оптимизации вообще). Другое, менее известное следствие — помимо подавления неупорядоченного выполнения (out-of-band execution) на уровне компилятора, компилятор предпринимает усилия для подавления такого выполнения и на уровне процессора тоже (вставкой memory barrier-ов).
>Дек имеет АМОРТИЗИРОВАННОЕ константное время вставки/удаления только в начало и конец (а не в произвольное место
— Было дело, реализовывали дек на основе плавающего массива. Добавление в произвольное место — логарифм.
— Было дело, реализовывали дек на основе плавающего массива. Добавление в произвольное место — логарифм.
Спасибо.
Подправил часть про сложность у дек и оптимизацию у volatile.
Про volatile понял, что нужно будет мне еще почитать, т.к. чувствую что тема сложнее чем мне казалось.
Подправил часть про сложность у дек и оптимизацию у volatile.
Про volatile понял, что нужно будет мне еще почитать, т.к. чувствую что тема сложнее чем мне казалось.
Такая же статья по питону кому-то нужна?
А по С++ нужна была? Спорный вопрос, забивание памяти какими-то тонкостями не даст понимания, не заменит опыта
Да почему «тонкостями»-то?.. Что за отношение к программированию?
Вы мне напоминаете студентов ВУЗа, с которыми я, учась в своем ВУЗе, ну, скажем так, «конкурировал». Они на любой практический вопрос любили отвечать «Ой, да зачем это знать? Нас учат учиться. Захотим — узнаем», при этом большинство из них так ничего и не узнали ни тогда, ни позже.
Это далеко не тонкости, не трюки, обычные вопросы, не сложные. Любой человек, который пишет(не знает в совершенстве, а просто пишет) программы на С++ должен знать на них ответы.
Вы мне напоминаете студентов ВУЗа, с которыми я, учась в своем ВУЗе, ну, скажем так, «конкурировал». Они на любой практический вопрос любили отвечать «Ой, да зачем это знать? Нас учат учиться. Захотим — узнаем», при этом большинство из них так ничего и не узнали ни тогда, ни позже.
Это далеко не тонкости, не трюки, обычные вопросы, не сложные. Любой человек, который пишет(не знает в совершенстве, а просто пишет) программы на С++ должен знать на них ответы.
Да.
Да!
UFO just landed and posted this here
UFO just landed and posted this here
Если есть вопрос про volatile, почему нет про explicit или mutable? :)
9. Сколько в памяти занимает произвольная структура?
Ответ: sizeof всех членов +… + vtable (если есть виртуальные функции) +…
Неправильно. За этим обычно следует вопрос: «Так что, получается, каждый объект от класса с виртуальными методами имеет свою собственную копию vtable?»
8. Каким свойством должен обладать объект, чтобы его можно было добавить в ассоциативные контейнеры в качестве ключа?
Ответ: Т.к. значения в ассоциативных контейнерах хранятся отсортированными, то объект должен реализовывать оператор сравнения <, а остальные операторы сравнения могут быть выражены через него.
Не обязательно, можно передать функтор, реализующий оператор < в качестве второго (в случае std::set) шаблонного параметра.
На нескольких собеседованиях спрашивали вопрос, что выведет:
Правильный ответ естественно undefined behavior.
int i = 5;
printf( "%d,%d", ++i, ++i );
Правильный ответ естественно undefined behavior.
Интересно просто почитать, для развития. Спасибо!
Ответ: sizeof всех членов + остаток для выравнивания (по умолчанию выравнивание 4 байта) + vtable (если есть виртуальные функции) + указатели на классы предков, от которых было сделано виртуальное наследование (размер указателя * количество классов)
На самом деле vtable не создается для каждого экземпляра класса. Объекты одного и того же типа ссылаются на одну и ту же vtable. Конкретный экземпляр имеет ссылку на эту таблицу.
class NoCopybale
правильно — Copyable
Меня просили рассказать о процессе компиляции, линковки (как можно ускорить/замедлить их), о порядке инициализации статических переменных и членов класса.
> 19. Что стоит учитывать при использовании auto_ptr?
Стоит учитывать, что он deprecated и если вам можно использовать C++11, то нужно использовать std::unique_ptr и std::shared_ptr, которые могут работать с массивами, так как позволяют указывать deleter.
> 6. Как защитить объект от копирования?
> Ответ: Сделать private конструктор копирования и оператор =.
Верно, но в C++11 можно красивее: см. deleted member functions.
Стоит учитывать, что он deprecated и если вам можно использовать C++11, то нужно использовать std::unique_ptr и std::shared_ptr, которые могут работать с массивами, так как позволяют указывать deleter.
> 6. Как защитить объект от копирования?
> Ответ: Сделать private конструктор копирования и оператор =.
Верно, но в C++11 можно красивее: см. deleted member functions.
Ответ на первый вопрос уже порадовал, он довольно глуп и я бы такого человека уже не взял на работу, это явно ему просто сказали и все, и этот человек не особо понимает смысла сей конструкции.
Все же виртуальный деструктор нужен для того, чтобы был вызван нужный деструктор, а не деструктор класса к которому был приведен указатель на объект, соответственно и вся цепочка деструкторов следуя наследованию. Да и объяснив что такое виртуальность было бы пользы в разы больше :)
Все же виртуальный деструктор нужен для того, чтобы был вызван нужный деструктор, а не деструктор класса к которому был приведен указатель на объект, соответственно и вся цепочка деструкторов следуя наследованию. Да и объяснив что такое виртуальность было бы пользы в разы больше :)
Стоило бы рассмотреть оператор new (*memory) className; частенько при использовании менеджеров памяти требуется.
UFO just landed and posted this here
И ещё, не обратил внимание: как это у нас сортировка делается без доп переменной? Хотите сказать, что в std::swap она не порождается?
Имелось ввиду, что в мое коде не используется. В std::swap конечно же есть.
А вообще для простых типов можно было бы написать полностью свободный от временных переменных алгоритм через XOR.
А вообще для простых типов можно было бы написать полностью свободный от временных переменных алгоритм через XOR.
Это когда регистров жалко! А в тех областях, где на плюсах прогают, их обычно хватает!
В обмене без дополнительной переменной через xor тоже, кстати, часто делают ошибку.
Какую?
Вот такую:
Сэкономили 2 строчки, зато получили UB.
void swap(int& x, int& y)
{
x^=y^=x^=y;
}
Сэкономили 2 строчки, зато получили UB.
Хехе, это, видимо, те же самые люди, что придумали:
int i = 1;
i = i++ + i + ++i;
Ну кто мог написать i = i+++i+++i; в здравом уме, я представить не могу.
А своп такой придумать — вполне. Красивее ведь, чем в 3 строчки, а про sequence points не все в курсе.
А своп такой придумать — вполне. Красивее ведь, чем в 3 строчки, а про sequence points не все в курсе.
Ну в примере с xor-ом то UB не из-за порядка операций, а в случае (&x==&y)
Вот на собеседованиях по плюсам ненавижу вопросы, где в одну строчку автор выписывает выражение без скобок со всеми известными ему операторами и надо сказать, что при этом получится. Оно, конечно, понятно, что приоритет операций и все такое, но в качестве ответа всегда хочется сказать, что автора подобного кода надо успеть закопать до того, как он успеет наплодить его многие килобайты.
Есть еще довольно известный список вопросов вот здесь. Без ответов правда.
В вашем примере пункта #14 полиморфизма нет. Есть method overriding.
Полиморфизм бывает статический и динамический. У меня пример первого, а вы имеете ввиду второй.
Статический полиморфизм или compile-time polymorphism это то, что предлагают шаблоны функций/классов (class/function templates).
это то, что предлагают шаблоны функций/классов (class/function templates).
Почему вы решили, что только они? Можете дать ссылку на какой-то стандарт?
Вот вы упомянули method overriding, а я вот думаю, что это тоже полиморфизм, одна из ее разновидностей. Или вы не согласны с этим? Если не согласны дайте определение полиморфизму желательно подкрепленное чем-нибудь.
In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.
…
- Ad-hoc polymorphism: If the function denotes different and potentially heterogeneous implementations depending on a limited range of individually specified types and its combination, it is called ad-hoc polymorphism. Ad-hoc polymorphism is supported in many languages using function and method overloading.
- Parametric polymorphism: If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism.
…
In the object-oriented programming community, programming using parametric polymorphism is often called generic programming.
- Subtype polymorphism: In object-oriented programming, subtype polymorphism or inclusion polymorphism is a concept in type theory wherein a name may denote instances of many different classes as long as they are related by some common super class.
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
Т.е. что в ссылке приведенной вами есть method overloading вас не смущает, а method overriding смущает? Вы же написали, что method overriding это не полиморфизм.
Ладно. Итого, я считаю, т.к. в стандарте нет точно описания, что можно считать полиморфизмом, а что нет, все рассуждения на эту тему высказывание собственного мнения, которое не может считаться конечной инстанцией.
Ладно. Итого, я считаю, т.к. в стандарте нет точно описания, что можно считать полиморфизмом, а что нет, все рассуждения на эту тему высказывание собственного мнения, которое не может считаться конечной инстанцией.
Вы не видите разницы между method overloading и method overriding?
Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
UFO just landed and posted this here
Когда нельзя кидать исключение и почему? (нельзя из деструктора, так невозможно будет написание кода, удовлетворяющего базовой гарантии… эээ как это по-русски… юезопасности исключений? basic exception-safety guarantee — что-то типа того)
ну и собственно какие гарантии безовасности исключений известны, какие гарантируются контейнерами STL и т.п.
на виндах и юниксе интересно спросить про разницу в реализации catch(...)
Какие бывают виды оператора new()? (интересен главным образом placement new)
ну и собственно какие гарантии безовасности исключений известны, какие гарантируются контейнерами STL и т.п.
на виндах и юниксе интересно спросить про разницу в реализации catch(...)
Какие бывают виды оператора new()? (интересен главным образом placement new)
Ни пузырёк, ни переворот строки не компилируется в g++ 4.4 (expected ‘;’ before ‘i’).
На момент разбора компилятор не видит различий между членами класса и типами, определёнными в нём. То есть, надо писать
Более подробно об использовании typename.
На момент разбора компилятор не видит различий между членами класса и типами, определёнными в нём. То есть, надо писать
typename T::size_type
в 4-х местах.Более подробно об использовании typename.
Про инкапсуляцию я бы сказал, что это один из основных инструментов управления сложностью, позволяющий опустить детали реализации и оперировать на другом уровне. Инкапсуляция не обязательно может быть в объекте, она может быть в пакете, например.
Прекрасный вопрос, на который я однажды попался: «Как сравнить две переменные типа double или float на равенство?» — взят отсюда easy-coding.blogspot.com/2011/01/blog-post_7753.html
Популярные вопросы на собеседовании по Ruby и ответы на них
…
5. Можете ли вы написать код для переворота строки?
str.reverse
…
Странный язык этот С++. Сколько лет ему, а вопросы все те же – развернуть строку, и что главное, решение становится все сложней и сложней!..
…
5. Можете ли вы написать код для переворота строки?
str.reverse
…
Странный язык этот С++. Сколько лет ему, а вопросы все те же – развернуть строку, и что главное, решение становится все сложней и сложней!..
Вот еще часто задают:
В чем отличия между указателем и ссылкой?
В чем отличия между указателем и ссылкой?
Кто у кого содрал? :-)
https://bool.dev/blog/detail/tipichnye-voprosy-na-sobesedovanii-po-cplusplus
"Как защитить объект от копирования?"
В современных версиях языка можно использовать ключевое слово delete
MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;
Еще спрашивают про variadic templates
Sign up to leave a comment.
Популярные вопросы на собеседовании по C++ и ответы на них