C ++:修改const的数组值

时间:2010-10-08 05:58:17

标签: c++ arrays const

请考虑以下事项:

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 个答案:

答案 0 :(得分:2)

D的值在您指定的行中确定。它不能仅因为用于计算它的表达式中的值发生更改而更改,即使它未声明const。 (很少有编程语言的变量像Excel电子表格单元一样工作:重新计算所有内容的成本是不可预测的,但是很重要。)

如果您想要更改D的值,则必须显式指定一个新值,除非您删除const,否则编译器不会允许您执行此操作。

答案 1 :(得分:1)

您可以为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();
};

你的班级在这里依赖于它必须保持活动的两个值,即如果其中一个超出范围,你的班级就会有错误的引用。你可以重载operator int()来代替get(),虽然隐式转换重载通常被认为是不好的做法。

答案 2 :(得分:0)

计算D的值并将其存储在以下行中:

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

D现在是一个变量,它有自己的值。 D是const,它的值永远不会改变(没有黑客攻击)。

未定义C ++变量(以及任何编程语言变量) 与其他变量的关系。它们被定义为可变(或不可)的值。

答案 3 :(得分:0)

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

就在那里。此时,D的值由a[1]a[0]的当前值确定并存储。然后,它会完全与a[1]a[0]断开连接。对这两者的更改将不再对D产生影响。

在绝大多数编程语言中,这正是它的工作原理。 =运算符称为赋值运算符。它在右侧获取表达式的结果,并将其分配给左侧的变量。它按价值运作,而不是通过参考。因此它只会将执行时的值赋给变量。该变量不会随着第二次分配而改变。

在C ++和其他一些语言中,有些情况并非如此,它们处理的是指针。并且看起来像这样:

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

右侧的表达式是分配给指针的(单个)变量的地址(&运算符是地址运算符,声明上的*运算符声明{{ 1}}是一个指针)。然后指针包含该变量的地址。取消引用时它给出的值是变量的值。但是,指针只保存单个变量的值。它们不能是表达式的别名。但是在你进一步深入研究指针之前,你应该让自己更好地掌握语言。指针是相当复杂和高级的主题。

答案 4 :(得分:0)

这是一个反问题,可以帮助您思考这是如何工作的:

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

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

现在,在改变D之后,[0]和[1]应该分别为1和5,2和4,还是3和3?

如果这没有意义,那为什么它应该反过来呢?