- •Классы и заголовочные файлы Отделение объявления от реализации
- •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 () {
- •Другие вложенные пользовательские типы данных в классах
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, то немного странно, что оно существует отдельно от самого класса.
