Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Int m_dollars;

public:

Dollars (int dollars) { m_dollars = dollars; }

Int getDollars () const {return m_dollars;}

};

Dollars add (const Dollars &d1, const Dollars &d2) {

return Dollars (d1.getDollars () + d2.getDollars ()); // возвращаем //анонимный объект класса Dollars

}

Int main () {

Dollars dollars1(7);

Dollars dollars2(9);

std::cout << "I have " << add (dollars1, dollars2).getDollars() << " dollars." << std::endl; // выводим анонимный объект класса Dollars

return 0;

}

Эта версия функции add () идентична вышеприведенной функции add(), за исключением того, что вместо отдельного объекта используется анонимный объект класса Dollars. Также обратите внимание, в функции main () мы больше не используем переменную с именем sum. Вместо нее мы используем возвращаемое анонимное значение из функции add ()!

В результате, наша программа стала короче, чище и проще. Фактически, поскольку dollars1 и dollars2 используются только в одном месте, мы можем еще упростить этот код с помощью анонимных объектов:

#include <iostream>

class Dollars {

private:

Int m_dollars;

public:

Dollars (int dollars) { m_dollars = dollars; }

Int getDollars() const { return m_dollars; }

};

Dollars add (const Dollars &d1, const Dollars &d2) {

return Dollars(d1.getDollars() + d2.getDollars()); // возвращаем анонимный объект класса Dollars

}

Int main () {

std::cout << "I have " << add(Dollars(7), Dollars(9)).getDollars() << " dollars." << std::endl; // выводим анонимный объект класса Dollars

return 0;

}

Заключение

Анонимные объекты в языке C++ используются для передачи или возврата значений без необходимости создавать большое количество временных переменных. Динамическое выделение памяти также выполняется через анонимные объекты (поэтому адрес выделенной памяти должен быть присвоен указателю, иначе мы не имели бы способа ссылаться/использовать её).

Стоит еще отметить, что анонимные объекты рассматриваются как r-values (а не как l-values, у которых есть адрес). Это означает, что анонимные объекты могут передаваться или возвращаться только по значению или по константной ссылке. В противном случае, должна использоваться переменная.

Помните, что анонимные объекты можно использовать только один раз, так как они имеют область видимости выражения. Если вам нужно ссылаться на значение в нескольких выражениях, то для этого следует использовать отдельную переменную.

Вложенные типы данных в классах

Рассмотрим следующий код:

#include <iostream>

enum FruitList {

AVOCADO,

BLACKBERRY,

LEMON

};

class Fruit {

private:

FruitList m_type;

public:

Fruit (FruitList type): m_type(type) {}

FruitList getType () { return m_type; }

};

Int main () {

Fruit avocado (AVOCADO);

if (avocado.getType() == AVOCADO)

std::cout << "I am an avocado!";

else

std::cout << "I am not an avocado!";

return 0;

}

В этой программе всё работает. Но поскольку перечисление 

FruitList используется в связке с классом Fruit, то немного странно, что оно существует отдельно от самого класса.