【问题标题】:Is member value in the class initialized when an object is created?创建对象时是否初始化了类中的成员值?
【发布时间】:2013-08-08 07:21:38
【问题描述】:

我正在写一个哈希类:

struct hashmap {
  void insert(const char* key, const char* value);
  char* search(const char* key);
 private:
  unsigned int hash(const char* s);
  hashnode* table_[SIZE]; // <--
};

由于 insert() 在插入新对时需要检查 table[i] 是否为空,所以我需要在启动时将表中的所有指针设置为 NULL。

我的问题是,这个指针数组table_会自动初始化为零,还是我应该在构造函数中手动使用循环将数组设置为零?

【问题讨论】:

  • hashnode* table_[SIZE]{};
  • 我希望您只是将其作为练习,因为 C++ 在 std::unordered_map 中已经有一个哈希映射。
  • @JoachimPileborg 遗憾的是我的项目中没有 C++11 和提升。
  • @Deqing,是的,没有答案也可以,但这是最干净的一个。
  • @BЈовић, Are you sure?

标签: c++ initialization member c++03


【解决方案1】:

table_ 数组将在您当前的设计中未初始化,就像您说 int n; 一样。但是,您可以在构造函数中对数组进行值初始化(从而对每个成员进行零初始化):

struct hash_map
{
    hash_map()
    : table_()
    {
    }

    // ...
};

【讨论】:

  • 尝试了std::fill,但失败了:error: invalid conversion from ‘long int’ to ‘hashnode*’ [-fpermissive]。顺便说一句,我的项目中没有 C++11 :(
  • 我确信这种零初始化也适用于 C++03。你说它没有?我当然会在 C++03 代码中使用它,而 gcc 会通过 -Wall -Wextra -pedantic-errors -std=c++98 接受它。
  • @juanchopanza:完全正确,我不知道我在想什么。我想我被你不能用任意内容初始化数组的事实吓坏了,但值初始化当然是有效的。虽然知道这是否在 C++98 和 C++03 之间发生了变化会很有趣!
  • @Deqing:请看更新版本;这即使在 C++03 中也应该可以工作。抱歉,太密集了……
  • 好的,感谢您的检查。那太可怕了!所以不需要OP去玩std::fill,挺好的。
【解决方案2】:

您必须将所有指针设置为 NULL。 您不必使用循环,您可以在构造函数中调用:

memset(table_, 0, SIZE*sizeof(hashnode*));

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多