- •Классы и заголовочные файлы Отделение объявления от реализации
- •Int m_month;
- •Int m_year;
- •Int getValue () { return m_value ; }
- •Int getValue () {return m_value;}
- •Классы и заголовочные файлы
- •Int getDay () {return m_day;}
- •Void Date::SetDate (int day, int month, int year) {
- •Параметры по умолчанию
- •Библиотеки
- •Заключение
- •Классы и const
- •Константные объекты классов
- •Int m_value;
- •Int getValue () { return m_value ; }
- •Int main () {
- •Константные методы классов
- •Int m_value;
- •Int m_value;
- •Int m_value;
- •Константные ссылки и классы
- •Int getDay () {return m_day;}
- •Void printDate (const Date &date) {
- •Int main () {
- •Int m_month;
- •Int m_year;
- •Void setDate (int day, int month, int year) {
- •Перегрузка константных и неконстантных функций
- •Int main () {
- •Статические переменные-члены класса
- •Статические переменные-члены класса
- •Int generateId () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Статические члены не связаны с объектами класса
- •Int main () {
- •Определение и инициализация статических переменных-членов класса
- •Инициализация статических переменных-членов внутри тела класса
- •Использование статических переменных-членов класса
- •Int getId() const { return m_id; }
- •Int main () {
- •Статические методы класса
- •Int main () {
- •Int main () {
- •Статические методы не имеют указателя this
- •Int main () {
- •Предупреждение о классах со всеми статическими членами
- •Int main () {
- •Дружественные функции и классы
- •Int m_value;
- •Void reset (Anything &anything) {
- •Int main () {
- •Int m_value;
- •Дружественные функции и несколько классов
- •Дружественные классы
- •Примечания о дружественных классах:
- •Дружественные методы
- •If (m_displayIntFirst)
- •Int m_intValue;
- •Values (int intValue, double dValue) {
- •Анонимные объекты
- •Int main () {
- •Анонимные объекты класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars() const { return m_dollars; }
- •Int main () {
- •Вложенные типы данных в классах
- •Int main () {
- •Вложенные пользовательские типы данных в классах
- •Int main () {
- •Другие вложенные пользовательские типы данных в классах
Анонимные объекты
В некоторых случаях в языке 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:
