[英]Initializing data member of struct in C++
//无法弄清楚如何在// struct中初始化结构的数据成员。 我认为这违反了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"
}
有关类初始化的规则已更改。 从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) {}
这是通过构造函数完成的,您可以将初始值传递给该构造函数 。
就像是:
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"
}
如果您想知道为什么在没有构造函数的情况下也可以工作,那是因为没有构造函数的结构是聚合的 ,您可以使用聚合初始化 。
如果您想知道counter
成员的初始化,那是因为它是一个非静态数据成员,并且由于是C ++ 11标准,所以可以像这样初始化它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.