【问题标题】:How to set data with 0 in C++? [duplicate]如何在 C++ 中用 0 设置数据? [复制]
【发布时间】:2013-04-18 12:32:50
【问题描述】:

在 C 中,我们使用 memset() 函数将数据设置为 0(不仅用于初始化)。

我的数据可能被另一种方法更改,我想重用它,然后我想在重用它之前将其设置为 0

除了memset()之外,还有其他方法可以在 C++ 中将数据设置为 0 吗?

class MYClass : public NameSpace::ParentClass {

    private:
        struct mystruct data

    public:
        void method();
};

void MYClass::method() {
    memset(&data, 0, sizeof(data)); // it's the C way. Are there another way in C++
}

【问题讨论】:

  • 这完全取决于mystruct的定义。
  • 更重要的问题是您为什么要这样做。这似乎是一个完全没有意义的操作,最坏的情况是你会得到未定义的行为。

标签: c++


【解决方案1】:

在 C++ 中,您将调用对象的构造函数,或原始无构造函数对象的初始化程序。

重新初始化实际上应该很少发生(不要重复使用变量,创建新变量!它使程序流程更清晰)——但是当你需要它时,你可以重新分配一个新对象:

data = mystruct();

【讨论】:

  • 是否可以根据我的代码提供一个如何做的例子?
  • @MOHAMED 我提供的代码正是您所需要的,无需更改。
  • 但是 mystruct 是 C 中的一个 c 结构定义,它不是一个类
  • @MOHAMED 没关系。结构和类在 C++ 中是一样的,唯一的区别是成员和继承在类中默认是私有的,在结构中默认是公有的。其他一切都是一样的。
【解决方案2】:

POD types上可以使用memset,否则必须使用构造函数进行初始化。

【讨论】:

  • 可以当然使用std::memset,但一般来说你为什么会这样呢?毕竟,谁会写int i; memset(&i, 0 sizeof i);?没有人,因为它完全不可读。那么为什么要对其他类型使用相同的卷积运算呢?
  • 另请注意,有一些 POD 类型(例如指针、浮点类型、指向成员的指针),标准不保证 all-bits-0 是有效表示。实际上,对于指针或浮点数,您不太可能遇到这种情况,我对指向成员的指针不太有信心。
【解决方案3】:

C++ 的归零方式应如下所示:

struct mystruct
{
    int i;

    void Reset();
}

class MYClass : public NameSpace::ParentClass 
{
private:
    mystruct data

public:
    void method();
};

void mystruct::Reset()
{
    i = 0;
}

void MYClass::method() 
{
    data.Reset();
}

【讨论】:

  • 拥有reset 方法几乎总是一种反模式。
  • 让我们假设,在 OP 的情况下,这是一个“几乎”的情况:)
  • @KonradRudolph: 如果改为clear() 可以吗? ;-)
  • @Steve 不是特别是,不是——但无论如何,容器都是一种特殊的野兽,因为包括 C++ 在内的大多数语言都将它们视为固有的可变而不是值。但是,对于您自己创建的大多数类型,这不是一个好的规则。
  • .clear() 的最佳理由是拼出替代方案:myMap = std::map<std::string, double>(); - 我应该重复该类型吗?或myMap = decltype(myMap) - 我应该重复这个名字吗?任何类似于myMap = FOO 的语法都很麻烦。
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多