繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM