Basic C ++:如何初始化类的struct成员?

时间:2010-10-31 23:16:12

标签: c++ struct member initializer

我到处都看了,但还没有找到答案。

我有一个带有这些受保护成员的C ++类:

 struct tm  _creationDate;
 struct tm  _expirationDate;
 struct tm  _lockDate;

我想在实例化时初始化它们。如果我把它放在构造函数中:

 _creationDate = {0};
 _expirationDate = {0};
 _lockDate = {0};

编译器抱怨:“在{'token”之前预期的primary-expression

我也找不到在构造函数顶部的成员初始化列表中执行此操作的方法。怎么做到这一点?谢谢!

后续: 伙计们,谢谢你的回复。你不能在宣言中这样做;这是不允许的。所以唯一的方法似乎是memset或单独设置成员。我最后编写了一个实用程序函数来做到这一点。

4 个答案:

答案 0 :(得分:2)

您可以在此声明中执行此操作

_creationDate = {0}; // set everything to 0's

或者像这样

_creationDate = { StructElement1, StructElement2, ..., StructElement n);

,例如

_creationDate = { 0, false, 44.2);

或者在构造函数中调用结构中的每个元素并初始化如...

_creationData.thing1 = 0;
_creationData.thing2 = false;
_creationData.thing3 = 66.3;

答案 1 :(得分:1)

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

class C {
    struct tm  _creationDate;
    struct tm  _expirationDate;
    struct tm  _lockDate;
    C() : _creationDate(), ... {}

答案 2 :(得分:1)

我认为你只能在定义时初始化类似的结构:

struct tm a = {0}; // works ok
struct tm b;
b = {0};           // error

一个选项是使用“默认”值

class a
{
    a() : t() {}
    struct tm t;
};

或构造函数中的memset

struct tm creationDate;
memset((void*)&creationDate, 0, sizeof(struct tm));

答案 3 :(得分:0)

只有在C ++ 03中才有可能:

class foo
{
    tm _creationDate;
    public:
    foo()
    {
        tm tmp_tm = {0};
        _creationDate = tmp_tm;
    }
};

请注意,这将使用_creationDate的副本初始化tmp_tm,从而调用(最可能是自动生成的)复制构造函数。因此,对于大型结构,您应该坚持使用实用程序功能,因为这不需要复制整个结构。

顺便说一句,不应该使用以下划线开头的名称,因为它们是为标准库的实现而保留的(供内部使用),因此这可能会导致名称冲突或其他不良行为。