Рубрики

Изменяемое ключевое слово C ++

Be self controlled and alert. Your enemy the devil prowls 
around like a roaring lion looking for someone to devour.
1 Peter 5:8 (Bible) 


Спецификатор класса изменяемого хранилища в C ++ (или использование ключевого слова mutable в C ++)

auto, register, static и extern являются спецификаторами класса хранения в C. typedef также рассматривается как спецификатор класса хранения в C. C ++ также поддерживает все эти спецификаторы класса хранения. В дополнение к этому C ++ добавляет один важный спецификатор класса хранения, имя которого является изменяемым.


Зачем нужен изменчивый?

Иногда требуется изменить один или несколько членов данных класса / структуры через функцию const, даже если вы не хотите, чтобы функция обновляла другие члены класса / структуры. Эту задачу легко выполнить, используя ключевое слово mutable. Рассмотрим этот пример, где использование mutable может быть полезным. Предположим, вы идете в отель и отдаете приказ официанту принести какое-нибудь блюдо с едой. Отдав заказ, вы вдруг решаете сменить порядок питания. Предположим, что в отеле есть возможность сменить заказанную еду и снова принять заказ новой еды в течение 10 минут после выдачи 1-го заказа. Через 10 минут заказ не может быть отменен, а старый заказ не может быть заменен новым. Смотрите следующий код для деталей.

#include <iostream>
#include <string.h>

using std::cout;

using std::endl;

  

class Customer

{

    char name[25];

    mutable char placedorder[50];

    int tableno;

    mutable int bill;

public:

    Customer(char* s, char* m, int a, int p)

    {

        strcpy(name, s);

        strcpy(placedorder, m);

        tableno = a;

        bill = p;

    }

    void changePlacedOrder(char* p) const

    {

        strcpy(placedorder, p);

    }

    void changeBill(int s) const

    {

        bill = s;

    }

    void display() const

    {

        cout << "Customer name is: " << name << endl;

        cout << "Food ordered by customer is: " << placedorder << endl;

        cout << "table no is: " << tableno << endl;

        cout << "Total payable amount: " << bill << endl;

    }

};

  

int main()

{

    const Customer c1("Pravasi Meet", "Ice Cream", 3, 100);

    c1.display();

    c1.changePlacedOrder("GulabJammuns");

    c1.changeBill(150);

    c1.display();

    return 0;

}

Выход:

Customer name is: Pravasi Meet
Food ordered by customer is: Ice Cream
table no is: 3
Total payable amount: 100
Customer name is: Pravasi Meet
Food ordered by customer is: GulabJammuns
table no is: 3
Total payable amount: 150 

Внимательно следите за выходом вышеуказанной программы. Значения элементов данных placeorder и bill отличаются от функции const, поскольку они объявлены как изменяемые.

Ключевое слово mutable в основном используется для изменения конкретного члена данных объекта const. Когда мы объявляем функцию как const, указатель this, переданный функции, становится const . Добавление изменяемой переменной позволяет указателю const изменять элементы.
mutable особенно полезен, если большинство членов должно быть постоянным, но некоторые должны быть обновляемыми. Члены данных, объявленные как изменяемые, могут быть изменены, даже если они являются частью объекта, объявленного как const. Вы не можете использовать изменяемый спецификатор с именами, объявленными как static или const, или как ссылки.

В качестве упражнения прогнозируем выход следующих двух программ.

// ПРОГРАММА 1
#include <iostream>

using std::cout;

  

class Test {

public:

  int x;

  mutable int y;

  Test() { x = 4; y = 10; }

};

int main()

{

    const Test t1;

    t1.y = 20;

    cout << t1.y;

    return 0;

}

// ПРОГРАММА 2
#include <iostream>

using std::cout;

  

class Test {

public:

  int x;

  mutable int y;

  Test() { x = 4; y = 10; }

};

int main()

{

    const Test t1;

    t1.x = 8;

    cout << t1.x;

    return 0;

}

Источник:
Спецификатор класса изменяемого хранилища (только C ++)

Эта статья предоставлена Meet Pravasi . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Изменяемое ключевое слово C ++

0.00 (0%) 0 votes