非静态const数据成员有什么意义?

Sam*_*Sam 6 c++ static const

对于以下代码:

class A
{
public:
    const int cx = 5;
};
Run Code Online (Sandbox Code Playgroud)

这里,将为A的每个对象创建一个cx实例.这对我来说似乎是一种浪费,因为cx永远不会被修改.实际上,我没有看到任何理由为什么编译器不应该强制使const数据成员静态.有人可以向我解释一下吗?

Ben*_*ley 10

对于所有实例,const数据成员不必相同.您可以在构造函数中初始化它.

class A
{
public:
    A(int n) :cx(n) {}

    const int cx;
};

int main()
{
    A a1(10);
    A a2(100);
}
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,您必须在初始化列表中初始化它。当您进入构造函数的主体时,已经太晚了。即失败:`A(int n) { cx = n; }` (2认同)

Col*_*mbo 6

实际上,我没有看到任何理由为什么编译器不应该强制使const数据成员静态.

您是否认为cx可能在构造函数中初始化了一个在运行时已知的值 - 并且在不同的实例之间变化A
const成员不可能分配给他们,但有时候有一个不能改变其初始值的成员证明是有用的.

绝对不是最好的例子,而是说明这个想法:

struct Multiplier
{
    const int factor;

    Multiplier(int factor) : factor(factor) {}

    int operator()( int val ) const
    {
        return val * factor;
    }
};

std::vector<int> vec{1, 2, 3};
std::vector<int> vec2;

int i;
std::cin >> i;

std::transform( std::begin(vec), std::end(vec),
                std::back_inserter(vec2), Multiplier(i) );

// vec2 contains multiples of the values of vec
Run Code Online (Sandbox Code Playgroud)