C ++: изменение значений массива для const - PullRequest
1 голос
/ 08 октября 2010

Подумайте над следующим:

int a[2];
cin >> a[0] >> a[1];

const int D = a[1] - a[0];

cout << D << "\n";

a[1] = 5; a[0] = 2;

cout << D << "\n";

Я немного растерялся.Почему он печатает то же значение для D?Почему изменение значений массива не меняет значение D?В какой момент времени значение D определяется и сохраняется?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 08 октября 2010

Значение D определяется в строке, где вы его назначаете. Он не может измениться только потому, что значения в выражении, которое вы использовали для его вычисления, меняются, даже если оно не было объявлено const. (Немногие языки программирования имеют переменные, которые работают как ячейки электронной таблицы Excel: затраты на пересчет всего будут непредсказуемыми, но значительными.)

Если вы хотите, чтобы значение D изменилось, вы должны явно назначить новое значение, которое компилятор не позволит вам сделать, если вы не удалите const.

1 голос
/ 08 октября 2010

Вы можете создать специальный класс для D, который переоценивает, когда изменяются значения, на которые он ссылается.

class Diff
{
    int & first;
    int & second;

public:
    Diff( int & a, int & b ) :
      first( a ), second( b )
    {
    }

    int get() const
    {
       return first - second;
    }
};

std::ostream & operator<<(std::ostream & os, const Diff & diff )
{
   return os << diff.get();
};

Ваш класс здесь полагается на два значения, которые он должен оставить действующим, т.е.вне области у вас будут плохие ссылки в вашем классе.Вы можете перегрузить оператор int () вместо get (), хотя неявные перегрузки преобразования обычно считаются плохой практикой.

0 голосов
/ 08 октября 2010

Вот контр-вопрос, который должен помочь вам подумать о том, как это работает:

int a[2];
cin >> a[0] >> a[1];

int D = a[1] - a[0];
D = 6;

Теперь, после изменения D, a [0] и a [1] должны быть 1 и 5, 2и 4, или 3 и 3 соответственно?

Если это не имеет смысла, то почему это должно работать наоборот?

0 голосов
/ 08 октября 2010
const int D = a[1] - a[0];

Прямо там.В этот момент значение D определяется из текущего значения a[1] и a[0] и сохраняется.Затем он полностью отключается от a[1] и a[0].Изменения этих двух параметров больше не будут влиять на D.

. В подавляющем большинстве языков программирования именно так и будет работать.Оператор = называется оператором присваивания.Он берет результат выражения с правой стороны и присваивает его переменной слева.Это работает по значению, а не по ссылке.Таким образом, переменная будет присваивать только значение во время выполнения.Переменная не изменится без второго присваивания.

В C ++ и некоторых других языках есть случаи, когда это не совсем верно, они имеют дело с указателями.И будет выглядеть так:

int b = 5;
int *d = &b; 

Выражение справа - это адрес (единственной) переменной, которая присваивается указателю (оператор & является оператором адреса, * оператор объявления объявляет, что d является указателем).Затем указатель содержит адрес этой переменной.Значение, которое оно дает при разыменовании, является значением переменной.Однако указатели содержат только значение одной переменной.Они не могут быть псевдонимом выражения.Но прежде чем углубляться в указатели, вы должны лучше понять язык в целом.Указатели - довольно сложная и сложная тема.

0 голосов
/ 08 октября 2010

значение D рассчитывается и сохраняется в этой строке:

const int D = a[1] - a[0];

D теперь является переменной со своим собственным значением. D const, его значение никогда не изменится (без взлома).

Переменные C ++ (и любая переменная языка программирования) не определены как отношение к другим переменным. Они определяются как изменяемые (или нет) значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...