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

Анонимные объекты

   В некоторых случаях в языке C++ переменная может быть нам нужна только временно. Например:

#include <iostream>

int add (int a, int b) {

int result = a + b;

return result;

}

Int main () {

std::cout << add(4, 2);

return 0;

}

В функции add () переменная result используется как временная переменная. Она не выполняет особой роли, функция использует её только для возврата значения.

Есть более простой способ написать функцию add () — через анонимный объект. 

Анонимный объект — это значение без имени. Поскольку имени нет, то и способа ссылаться на этот объект за пределами места, где он создан — тоже нет.

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

Вот функция add (), приведенная выше, но уже с использованием анонимного объекта:

#include <iostream>

int add (int a, int b) {

return a + b; // анонимный объект создается для хранения и //возврата результата выражения a + b

}

int main () {

std::cout << add(4, 2);

return 0;

}

При вычислении выражения a + b, результат помещается в анонимный объект. Затем копия анонимного объекта возвращается по значению обратно в вызывающий код, и анонимный объект уничтожается.

Это работает не только с возвращаемыми значениями, но и с параметрами функции. Например, вместо этого:

#include <iostream>

void printResult (int value) {

std::cout << value;

}

int main () {

int result = 4 + 2;

printResult (result);

return 0;

}

Мы можем написать это:

#include <iostream>

void printResult (int value) {

std::cout << value;

}

int main () {

printResult (4 + 2);

return 0;

}

В этом случае выражение 4 + 2 генерирует результат 6, который помещается в анонимный объект. Затем копия этого анонимного объекта передается в функцию printResult () (которая выводит значение 6) и уничтожается.

Обратите внимание, насколько чище стал наш код — нам не нужно засорять его временными переменными, которые используются только один раз.

Анонимные объекты класса

Хотя в вышеприведенных примерах мы использовали только фундаментальные типы данных, анонимные объекты также могут использоваться и с классами. Достаточно просто не указывать имя объекта:

Dollars dollars(7); // обычный объект класса

Dollars(8); // анонимный объект класса

В примере, приведенном выше, строка Dollars (8); создаст анонимный объект класса Dollars, инициализирует его значением 8, а затем уничтожит. В этом контексте пользы мы много не получим. Рассмотрим пример, где это может принести пользу:

#include <iostream>

class Dollars {

private:

int m_dollars;

public:

Dollars (int dollars) {m_dollars = dollars;}

int getDollars () const {return m_dollars;}

};

void print (const Dollars &dollars) {

std::cout << dollars.getDollars() << " dollars.";

}

int main () {

Dollars dollars (7);

print(dollars);

return 0;

}

Здесь функция main () передает объект dollars в функцию print (). Мы можем упростить эту программу, используя анонимные объекты:

#include <iostream>

class Dollars {

private:

int m_dollars;

public:

Dollars (int dollars) { m_dollars = dollars; }

int getDollars() const { return m_dollars; }

};

void print (const Dollars &dollars) {

std::cout << dollars.getDollars() << " dollars.";

}

int main () {

print (Dollars(7)); // здесь мы передаем анонимный объект класса //Dollars

return 0;

}

Результат выполнения программы:

7 dollars.

Теперь рассмотрим пример сложнее:

#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) {

Dollars sum = Dollars(d1.getDollars() + d2.getDollars());

return sum;

}

int main () {

Dollars dollars1(7);

Dollars dollars2(9);

Dollars sum = add (dollars1, dollars2);

std::cout << "I have " << sum.getDollars() << " dollars." << std::endl;

return 0;

}

В функции add () у нас есть значение переменной sum класса Dollars, которое используется в качестве промежуточного значения для хранения результата и его возврата.

И в функции main () у нас есть значение переменной sum класса Dollars, которое также используется, как промежуточное.

Можно сделать проще, используя анонимные объекты:

#include <iostream>

class Dollars {

private: