//无法弄清楚我们如何初始化内部结构的数据成员 //结构我认为这违反了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"
}
答案 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那样的。