我是这样使用 memset 的:
class A {
public:
A();
private:
int a;
float f;
char str[35];
long *lp;
};
A::A()
{
memset(this, 0, sizeof(*this));
}
}
我应该这样使用吗?为什么和为什么不呢?有没有更好的办法?需要一些指导..
最佳答案
这通常是个坏主意。
如果有人向类中添加一个新成员,如果新成员的类型具有适当的构造函数并且 memset
不合适,则它可能会严重崩溃。
形式上,根据标准,您的用户定义的构造函数意味着 A
不是 POD 类型(或 C++11 中的平凡可复制类型),因此使用 memset
或 memcpy
就可以了。
有几种方法可以安全地做到这一点:
A::A() : a(), f(), str(), lp()
{ }
或者,不添加构造函数和值初始化类型的实例:
A a = A();
或者,将 POD 成员组合在一起并在构造函数中一次对它们进行值初始化:
class A {
public:
A();
private:
struct Data {
int a;
float f;
char str[35];
long *lp;
};
Data data;
};
A::A() : data()
{ }
一般来说,最好在 C++ 中使用值初始化并依靠编译器执行与 memset
等效的操作(或调用默认构造函数),而不是显式使用 memset
你自己。代码将不那么脆弱并且更易于维护。
关于c++ - 这样使用memset好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22632960/