基础C++:如何初始化类的结构体成员?

4
我已经到处查找,但没有找到答案。
我有一个C++类,其中包含以下受保护的成员:
 struct tm  _creationDate;
 struct tm  _expirationDate;
 struct tm  _lockDate;

我想在实例化时对它们进行初始化。如果我把这个放在构造函数中:
 _creationDate = {0};
 _expirationDate = {0};
 _lockDate = {0};

编译器报错:在“{”令牌之前期望主表达式。
我也找不到在构造函数顶部的成员初始化列表中完成它的方法。如何做到这一点?谢谢!
跟进: 感谢大家的回复。你不能在声明时做到这一点;那是不允许的。因此,唯一的方法似乎是使用memset或单独设置成员。最终我编写了一个实用程序函数来完成这个任务。
4个回答

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;

2
谢谢。在C++对象中,只有最后一个选项可用;使用大括号的初始化程序不允许用于成员。 - Oscar

1

谢谢。虽然在初始化列表中允许使用该语法,但无法使用 {0} 初始化成员。 - Oscar

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));

1

在C++03中唯一可能的方法:

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

请注意,这会使用 tmp_tm 的副本初始化 _creationDate ,从而调用(最可能是自动生成的)复制构造函数。因此,对于大型结构体,您应该坚持使用实用程序函数,因为这不需要复制整个结构体。
顺便说一下,在全局范围内以下划线开头的名称保留给标准库实现。 以下划线和大写字母开头的名称在任何地方都是保留的。 从技术上讲,这里的名称 _creationDate 是可以的,因为这不在全局范围内,但我仍然建议避免在名称前面使用下划线。

带下划线的变量名是合法的——也许你与“双下划线”混淆了,这是不建议使用的。 - John Simoes
1
@JohnSimoes,您是错误的,但我的文本也不是100%正确的。我已经相应地更新了它。 - smerlin
感谢@smerlin,我上面的评论确实是错误的。我很感激你的帮助,并相应地点赞了你编辑后的答案。在全局范围内,变量不应以下划线开头并且被保留。 - John Simoes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接