Возможна ли перегрузка операций для данных стандартных типов?

Вопросы к защите лабораторных по ООП №3 и №4

Магнитная буря

  1. Какие оператор-функции по умолчанию включаются в спецификацию класса, если они явно не определены?

 

class:: operator = ();

 

Паша из 12й сказал, что еще оператор new и delete… Но этим можно козырнуть только в самом крайнем случае.

Еще явный представитель перегруженного оператора это << и >> в cout и cin но оно и без класса может быть)

 

 

  1. Какой тип аргумента и кода возврата должен иметь оператор присваивания, создаваемый по умолчанию?

 

Тип аргумента – ссылка на объект класса, код возврата – указатель на this , то есть возвращает ссылку на объект класса.

 

 

  1. Сколько аргументов должна иметь компонентная оператор-функция, перегружающая унарную операцию?

 

Нисколько, т.к. при унарных действиях мы имеем дело только с одним операндом, который и будет генерировать вызов функции-оператора.

 

 

  1. Сколько аргументов должна иметь компонентная оператор-функция, перегружающая бинарную операцию?

 

Только один.

То есть например operator + (class), где class это тот объект который будет находиться справа от оператора, объект слева генерирует вызов оператора.

 

  1. Сколько аргументов должна иметь дружественная оператор-функция, перегружающая унарную операцию?

 

Т.к. в дружественную функцию не передается указатель this, то для унарных операций теобходим один аргумент, над которым и будет выполнятся действие.

 

 

  1. Какие операторы языка С не могут быть перегружены в классах объектов С++?

 

# (препроцессорный оператор);

. (выбор члена структуры);

:? (условный оператор);

sizeof() .

 

7. Как интерпретируется последовательность присваиваний: w = x = y = z;

 

W=(x=(y=z))

 

 

  1. Какие операции языка С++ не могут быть перегружены в классах объектов?

 

:: (разрешение области видимости);

.* (выбор члена класса через указатель на классовые члены);

typeid() (обеспечивает динамическую идентификацию типов).

 

 

  1. Что является аргументом return в коде оператора присваивания?

 

Указатель на этот же объект, то есть this.

 

 

  1. Сколько аргументов должна иметь дружественная оператор-функция, перегружающая бинарную операцию?

 

Т.к. в дружественную функцию не передается указатель this, то для бинарных операций необходимо два аргумента, один из которых будет левым а другой правым операндом.

Каким образом можно запретить присваивание объектов класса во внешних функциях?

 

Необходимо так объявить функцию оператор:

Class aa

{

private:

void operator = (const& аа);

};

 

  1. Можно ли перегрузить операцию ** для возведения в степень объектов класса?

 

Нельзя, так как такая перегрузка легко приводит к неоднозначности , то есть операция ** левоассоциативна или правоассоциативна, как должно быть интерпретировано выражение х**у, как х*(*у) или (х)**(у), Страуструп сказал, что лучше использовать , если есть возможность встроенные функции, то есть pow()вместо перегруженной **, хотя такие ограничения и весьма драконовские).

 

Возможна ли перегрузка операций для данных стандартных типов?

 

Нельзя, так сказала Волосатова в лекциях. Ну и вообще, так сделал создатель языка, что перегружать операторы можно только для пользовательских типов, а для стандартных используются оригинальные предназначения операторов.

 

  1. В каких случаях нельзя реализовать перегрузку операций и перегрузку оператора в форме компонентной функции класса?

Когда например, необходимо создать перегрузку оператора для класса и встроенного типа в любом порядке, т.е. class1=class+4 и class1=4+class. Или например чтобы можно было выполнять ++ справа и слева, т.е. ++class и class++

 

 

  1. Зачем нужны дружественные функции?

Дружественные функции не являются членами класса, но имеют доступ к его закрытым членам. Например, дружественная функция может быть дружественной нескольким классам => иметь доступ к их закрытым членам.

Так же, например, дружественная функция необходима для перегрузки операторов вне класса, т.е. для обеспечения операций с объектами и со встроенными типами данных в разном порядке, для обеспечения лево- и правоассоциативности.

 

  1. В каком случае неизбежно использование оператора преобразования типов?

 

Лишь тогда , когда необходимо непосредственное преобразование объекта в какой то встроенный тип.

Пользовательские преобразования типов рассматриваются лишь тогда, когда они необходимы для разрешения неоднозначностей вызова…

 

 

  1. Возможно ли реализовать внешнюю оператор-функцию для перегрузки бинарной операции, которой передаются два указателя на объекты класса?

Именно указатели передавать нельзя. Можно передать ссылку. (Вообще должны передаваться аргументы типа класс или перечисляемые — так сказал мой компилятор)

  1. Какие аргументы и код возврата имеет оператор преобразования типа?

 

Оператор преобразования типа имеет вид operator t () , где t — имя типа, т. е. тип class приводится к типу t.

ð Аргументов никаких, а код возврата переменная типа t.

 

  1. Что обеспечивает правую ассоциативность оператора присваивания?

 

Чтобы результат присваивания мог использоваться в виде a=b=c предполагается, что оператор присваивания вернет ссылку на тот же левосторонний операнд, поэтому и появляется правая ассоциативность.

 

20. Записать в функциональной форме присваивание w = x = y = z; где w, x, y, z