модификация константного объекта с использованием ссылки - PullRequest
2 голосов
/ 29 декабря 2011

Когда функция принимает параметр от reference до const object, я понимаю, что объект, переданный ему в качестве аргумента, нельзя изменить с помощью reference?Так есть ли в C ++ сценарии, в которых const object можно изменить с помощью ссылки на него?Если да, покажите пример.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

C ++ имеет функцию под названием mutable, в которой элемент данных может быть изменен даже через постоянную ссылку :

class Foo {
public:
    int a;
    mutable int b;
};

int main() {
    Foo f;
    f.a = 1; // ok
    f.b = 2; // ok
    const Foo &g = f;
    g.a = 1; // compile error
    g.b = 2; // ok
}

Я получаю следующую ошибку:

In function 'int main()':
Line 12: error: assignment of data-member 'Foo::a' in read-only structure
compilation terminated due to -Wfatal-errors.

Тем не менее, присвоение g.b = 2; успешно.

Эта функция обычно используется только для private переменных-членов, когда изменение элемента данных не влияет на внешнее видимое постоянство элемента.объект.Например, его можно использовать в качестве оптимизации, чтобы обеспечить способ кэширования ранее рассчитанных значений.

1 голос
/ 29 декабря 2011

Вы всегда можете сбросить const -несс, используя const_cast;это может привести к неопределенному поведению, если вы не будете осторожны.

Полагаю, вы также можете придумать что-то вроде этого:

class Foo
{
private:
    mutable int x;

public:
    void bar() const { x++; }
};

void func(const Foo &foo)
{
    foo.bar();
    // foo is now modified!
}
...