Константные функции-члены. Функции-члены volatile

Константные функции-члены. Функции-члены volatile


Содержание


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

Функции, которые возвращают константный объект называются константными функциями. Если такие функции объявлены в классе, то эти функции называются константными функциями-членами класса.
Чтобы объявить функцию, возвращающую константный объект, нужно перед объявлением функции разместить ключевое слово ‘const’

const returned_type FunName(parameters)
{
    // function's body
    // ...
}

где

  • returned_type – тип, возвращаемый функцией;
  • parameters – параметры функции;
  • FunName – имя функции, возвращающей константный объект (константной функции).

Если функция объявлена в классе, то ее объявление будет иметь приблизительно следующий вид:

class CMyClass
{
    private:
    // приватные члены и методы класса
    // ...

    public:
    // общедоступные члены и методы класса
    // ...

    // объявление константной функции в классе
    const returned_type FunName(parameters);
}

// реализация функции FunName
const returned_type CMyClass::FunName(parameters)
{
    // тело функции FunName()
    // ...
}

2. Пример объявления класса, содержащего константные (const) функции-члены

В примере объявляется класс CMyClass, содержащий константную функцию Get(), возвращающую константное значение типа double.

// класс, который содержит объявления константной функции
class CMyClass
{
    double x; // внутренняя переменная

    public:
    CMyClass(void); // конструктор

    void Set(double nx);
    const double Get(void); // константная функция-член класса
};

Использование константной функции из другого программного кода:

// использование константной функции
CMyClass MC;

MC.Set(25.08); // установление значения x

// использование константной функции Get() класса CMyClass
double t1 = MC.Get(); // t1 = 25.08 - инициализация переменной
const double t2 = MC.Get(); // t2 = 25.08 - инициализация константы

3. Какой общий вид функции-члена класса, возвращающей объект типа volatile?

Объект, объявленный со спецификатором volatile может быть изменен в программе неявно – без применения явным образом заданных команд. Ключевое слово volatile информирует компилятор, что значение переменной в программе может быть изменено неявно (программой обработки прерываний, фоновым процессом, и т.п.). Зная о такой изменчивости переменной в программе (ключевое слово volatile), компилятор сформирует код, который будет опрашивать значение переменной перед каждым ее использованием в программе. Таким образом, будет получено реальное (измененное) значение переменной (а не то, что было до изменения).



Например. Пусть в некоторой программе P реализована глобальная переменная X, содержащая адрес, который может быть изменен программой-обработчиком прерывания. Программа-обработчик прерывания будет вызываться независимо от выполнения данной программы P и соответствующим образом изменяет значение этой глобальной переменной X. Если в программе P не указать ключевого слова volatile перед X, то, при считывании значения X в программе P может отображаться старое значение X. Если указать слово volatile, то компилятор будет обновлять значения переменной X при каждом обращении к ней, и, искажения результата не произойдет.

Функции-члены, которые объявлены со спецификатором volatile просто возвращают непостоянный (volatile) объект. Такой объект может быть присвоен переменной, которая объявлена со спецификатором volatile.
Общий вид класса, содержащего функцию, которая возвращает volatile-значение

class CMyClass
{
    private:
    // приватные члены и методы класса
    // ...

    public:
    // общедоступные члены и методы класса
    // ...

    // объявление константной функции в классе
    volatile returned_type FunName(parameters);
}

// реализация функции FunName
volatile returned_type CMyClass::FunName(parameters)
{
    // тело функции FunName()
    // ...
}

где

  • returned_type – тип, который возвращается функцией;
  • parameters – параметры функции;
  • FunName – имя функции, которая возвращает volatile-объект.

4. Пример объявления класса, содержащего функции-члены volatile

В классе CMyVolatileClass объявлена функция Get(), которая возвращает volatile-значение типа double.

// класс, который содержит volatile-функцию
class CMyVolatileClass
{
    int d;

    public:
    CMyVolatileClass(void);

    // функции-члены класса
    // обычная функция-член класса
    void Set(int nd) { d = nd; }

    // функция-член класса, возвращающая volatile-значение
    volatile int Get(void);
};

Демонстрация использования класса в некотором методе или программном коде:

// класс, содержащий volatile-функцию
CMyVolatileClass VC;

VC.Set(33); // вызов обычной функции

// вызов volatile-функции для обычной переменной
int t1 = VC.Get(); // t1 = 33

volatile int t2;

// вызов volatile-функции для volatile-переменной
t2 = VC.Get(); // t2 = 33

Как видно из вышеприведенного кода, volatile-функции можно использовать в сочетании с обычными и volatile-переменными.


Связанные темы