在运行时分配后是只读的变量?

时间:2011-10-24 18:35:45

标签: c++ constants const

这里相当新的程序员,并为愚蠢的问题提前道歉。

我在程序中有一个int变量,用于确定我的某些结构中数组的长度。我曾经把它作为const int放在我的标题中。现在,我想分叉我的程序,根据给定的参数给变量赋予不同的值,但在运行时分配后保持只读。

我必须做的一些想法。有没有首选方式?

  1. 在我的标题中声明const int *并将其分配给我的主要功能中的const int,但这看起来很笨拙。
  2. 在我的主要功能中使其成为普通int
  3. 调用函数时将变量作为参数传递。
  4. 我尚未想到的其他东西。

4 个答案:

答案 0 :(得分:9)

我使用函数静态变量和简单函数。观察:

int GetConstValue(int initialValue = 0)
{
  static int theValue = initialValue;
  return theValue;
}

由于这是一个函数级静态变量,因此只在第一次初始化时才初始化。因此,在第一次运行函数后,initialValue参数无效。因此,您需要做的就是确保函数的第一次调用是初始化函数。

答案 1 :(得分:6)

C ++没有内置的解决方案,但如果你真的想确保你的int只被分配一次,你可以构建自己的特殊int类:

class MyConstInt
{
public: 
    MyConstInt(): assigned(false) {}
    MyConstInt& operator=(int v)
    {
        assert(!assigned); 
        value = v; 
        assigned = true; 
        return *this; 
    }   
    operator int() const 
    { 
        assert(assigned); 
        return value; 
    }
private: 
    int value; 
    bool assigned; 
}; 


MyConstInt mi; 
//  int i = mi;         //  assertion failure; mi has no value yet
mi = 42; 
//  mi = 43;        //  assertion failure; mi already has a value
int* array = new int[mi]; 

答案 2 :(得分:1)

什么时候才知道正确值?如果您从文件或其他内容中读取它,您可以说:

const int n = determine_correct_value();

答案 3 :(得分:0)

我很想说你想要的东西没有意义。常量是改变其值的东西,而不是可能改变其值一次或两次的东西。如果你想要一个全局变量,只需使它成为非常数。

另一方面,如果你有范围常量值,你只需要同时声明和初始化它们,遵循一般的C ++指南,尽可能接近使用站点。例如,在以下本地范围内标记常量的使用:

for (auto it = v.begin(), end = v.end(); it != end; ++it)
{
  const Foo & x = *it;
  const std::size_t n = x.get_number_of_bars();

  // use x and n ...

  const bool res = gobble(x, zip(n));
  if (res && shmargle(x)) { return 8; }
}

如果它们的值已经通过其他方式已知,编​​译器甚至可以选择不为变量生成任何特殊代码。