在C ++中初始化struct的数据成员

时间:2016-04-12 13:00:14

标签: c++ functor

//无法弄清楚我们如何初始化内部结构的数据成员 //结构我认为这违反了OOP的指导方针。下面的程序没有显示任何编译器错误并运行罚款并给出输出10 30

#include<iostream>
using namespace std;
struct Accumulator
{
    int counter = 0;
    int operator()(int i) { return counter += i; }
};
int main(void)
{
   Accumulator acc;
   cout << acc(10) << endl; //prints "10"
   cout << acc(20) << endl; //prints "30"
}

2 个答案:

答案 0 :(得分:1)

关于类初始化的规则已经改变。从C ++ 11开始,您可以直接在类主体中初始化非静态类成员。这只是语法糖。当你写

struct Accumulator
{
    int counter = 0;
    int operator()(int i) { return counter += i; }
};

编译器实际上会将计数器的初始化添加到默认构造函数中。所以上面的代码会被翻译成

struct Accumulator
{
    int counter;
    Accumulator() : counter(0) {}
    int operator()(int i) { return counter += i; }
};

如果您提供自己的初始化,也会禁止此初始化。如果我们有

struct Accumulator
{
    int counter = 0;
    int sum = 0;
    Accumulator() {}
    Accumulator(int counter) : counter(counter) {}
    int operator()(int i) { return counter += i; }
};

然后Accumulator() {}实际上是

Accumulator() : counter(0), sum(0) {}

Accumulator(int counter) : counter(counter) {}将是

Accumulator(int counter) : counter(counter), sum(0) {}

答案 1 :(得分:0)

使用构造函数完成,您可以传递初始值。

类似的东西:

struct Accumulator
{
    Accumulator(int initial = 0)
        : counter(initial)
    {}

    int counter;

    int operator()(int i) { return counter += i; }
};

int main(void)
{
    Accumulator acc(20);
    std::cout << acc(10) << '\n'; //prints "30"
    std::cout << acc(20) << '\n'; //prints "50"

    // Reset accumulator
    acc = Accumulator();  // Use constructors default argument
    std::cout << acc(10) << '\n'; //prints "10"
    std::cout << acc(20) << '\n'; //prints "30"
}

如果你想知道为什么它在没有构造函数的情况下工作,那是因为没有构造函数的结构是聚合,你可以使用aggregate initialization。< / p>

如果您想知道counter成员的初始化,那是因为它是non-static data member,而自C ++ 11标准以来initialized那样的。