Вопросы к защите лабораторных по ООП №3 и №4
Магнитная буря
- Какие оператор-функции по умолчанию включаются в спецификацию класса, если они явно не определены?
class:: operator = ();
Паша из 12й сказал, что еще оператор new и delete… Но этим можно козырнуть только в самом крайнем случае.
Еще явный представитель перегруженного оператора это << и >> в cout и cin но оно и без класса может быть)
- Какой тип аргумента и кода возврата должен иметь оператор присваивания, создаваемый по умолчанию?
Тип аргумента – ссылка на объект класса, код возврата – указатель на this, то есть возвращает ссылку на объект класса.
- Сколько аргументов должна иметь компонентная оператор-функция, перегружающая унарную операцию?
Нисколько, т.к. при унарных действиях мы имеем дело только с одним операндом, который и будет генерировать вызов функции-оператора.
- Сколько аргументов должна иметь компонентная оператор-функция, перегружающая бинарную операцию?
Только один.
То есть например operator + (class), где class это тот объект который будет находиться справа от оператора, объект слева генерирует вызов оператора.
- Сколько аргументов должна иметь дружественная оператор-функция, перегружающая унарную операцию?
Т.к. в дружественную функцию не передается указатель this, то для унарных операций теобходим один аргумент, над которым и будет выполнятся действие.
- Какие операторы языка С не могут быть перегружены в классах объектов С++?
# (препроцессорный оператор);
. (выбор члена структуры);
:? (условный оператор);
sizeof().
7. Как интерпретируется последовательность присваиваний: w = x = y = z;
W=(x=(y=z))
- Какие операции языка С++ не могут быть перегружены в классах объектов?
:: (разрешение области видимости);
.* (выбор члена класса через указатель на классовые члены);
typeid() (обеспечивает динамическую идентификацию типов).
- Что является аргументом return в коде оператора присваивания?
Указатель на этот же объект, то есть this.
- Сколько аргументов должна иметь дружественная оператор-функция, перегружающая бинарную операцию?
Т.к. в дружественную функцию не передается указатель this, то для бинарных операций необходимо два аргумента, один из которых будет левым а другой правым операндом.
Каким образом можно запретить присваивание объектов класса во внешних функциях?
Необходимо так объявить функцию оператор:
Class aa
{
private:
void operator = (const& аа);
};
- Можно ли перегрузить операцию ** для возведения в степень объектов класса?
Нельзя, так как такая перегрузка легко приводит к неоднозначности, то есть операция ** левоассоциативна или правоассоциативна, как должно быть интерпретировано выражение х**у, как х*(*у) или (х)**(у), Страуструп сказал, что лучше использовать, если есть возможность встроенные функции, то есть pow() вместо перегруженной **, хотя такие ограничения и весьма драконовские).
Возможна ли перегрузка операций для данных стандартных типов?
Нельзя, так сказала Волосатова в лекциях. Ну и вообще, так сделал создатель языка, что перегружать операторы можно только для пользовательских типов, а для стандартных используются оригинальные предназначения операторов.
- В каких случаях нельзя реализовать перегрузку операций и перегрузку оператора в форме компонентной функции класса?
Когда например, необходимо создать перегрузку оператора для класса и встроенного типа в любом порядке, т.е. class1=class+4 и class1=4+class. Или например чтобы можно было выполнять ++ справа и слева, т.е. ++class и class++
- Зачем нужны дружественные функции?
Дружественные функции не являются членами класса, но имеют доступ к его закрытым членам. Например, дружественная функция может быть дружественной нескольким классам => иметь доступ к их закрытым членам.
Так же, например, дружественная функция необходима для перегрузки операторов вне класса, т.е. для обеспечения операций с объектами и со встроенными типами данных в разном порядке, для обеспечения лево- и правоассоциативности.
- В каком случае неизбежно использование оператора преобразования типов?
Лишь тогда, когда необходимо непосредственное преобразование объекта в какой то встроенный тип.
Пользовательские преобразования типов рассматриваются лишь тогда, когда они необходимы для разрешения неоднозначностей вызова…
- Возможно ли реализовать внешнюю оператор-функцию для перегрузки бинарной операции, которой передаются два указателя на объекты класса?
Именно указатели передавать нельзя. Можно передать ссылку. (Вообще должны передаваться аргументы типа класс или перечисляемые — так сказал мой компилятор)
- Какие аргументы и код возврата имеет оператор преобразования типа?
Оператор преобразования типа имеет вид operator t (), где t — имя типа, т. е. тип class приводится к типу t.
ð Аргументов никаких, а код возврата переменная типа t.
- Что обеспечивает правую ассоциативность оператора присваивания?
Чтобы результат присваивания мог использоваться в виде a=b=c предполагается, что оператор присваивания вернет ссылку на тот же левосторонний операнд, поэтому и появляется правая ассоциативность.
20. Записать в функциональной форме присваивание w = x = y = z; где w, x, y, z