我可以只将数组的特定元素声明为常量吗? (C / C ++ / Fortran的)

时间:2015-06-20 07:53:08

标签: c++ c arrays fortran constants

情境: 我通过,例如一个2D矩阵作为函数中的参数,我希望能够读取和更改所有元素,但是 我想防止任何意外写入让我们说最后一栏。所以我想以某种方式告诉编译器使用此函数中的特定元素作为常量。

可能无法完成,但在某些情况下会有用。

5 个答案:

答案 0 :(得分:5)

数组是 common 类型的连续对象块;所以你所建议的内容不受支持。

适当的解决方案是封装数组并通过可以应用所需语义的函数访问它。实际上,如果您使用C ++,则可以将[]运算符重载的类封装在一起,这样您就可以在使用数组访问表示法的同时应用所需的语义。

答案 1 :(得分:0)

不,这是不可能的。这是因为array必须是普通类型,虽然int看起来与const int相同,但它的类型不同。

答案 2 :(得分:0)

In Fortran this is not possible. It does not have any two distinct type as int and const int in the other languages but still you can't just automatically protect a part of array from being modified. The intent(in) argument attribute can also protect only the array as a whole.

Just be sure you program your procedure right and test it thoroughly. You can use debuggers to test if a certain part of memory is modified or not.

答案 3 :(得分:0)

这是C ++中可能性的草图

class Item {
   protected:
      int <or some other type> value;
   public:
      Item(int x) : value (x) {};
      int Get() const ( return value; };
      void Set(int x) { throw std::runtime_error("Oh Dear!");
};

class Settable : public Item {
   public:
      void Set(int x) { value = x; };
};

然后2D矢量(我们使用C ++)可以

std::vector<std::vector<std::shard_ptr<item>>> list;

然后用上述对象的其他一个实例填充靴子。处理异常!

答案 4 :(得分:-1)

我建议你在用户试图覆盖它们时跳过这些元素。