在C里面经常使用memset来把一个结构体的内容全部设置为0。
memset(ps, 0, sizeof(S));
在C++11里面,利用aggregate initialization特性,可以写的更加好看。
void foo(S *ps){
*ps = { 0 }; // use aggregate initialization
}
*ps = { 0 };
实际发生的事情是ps->operator=({ 0 });
。在没有优化的情况下,{ 0 }
实际上构造了一个struct S
的临时对象,然后传给了opeator=
这个函数。
PS:*ps = { 0 };
和memset
的行为还是有一定区别的。如果struct S
里面有padding的数据的话,那么memset也会把padding的数据也设置成0,而*ps = { 0 };
不会。
测试代码(ideone)
#include <string.h>
#include <iostream>
using namespace std;
struct S {
int x;
//private:
S& operator=(const S& other){
cout << "Address of this " << this << endl;
cout << "Address of other " << &other << endl;
return *this;
};
};
void foo(S *ps){
memset(ps, 0, sizeof(S)); // old C way
*ps = { 0 }; // use aggregate initialization
}
int main(void)
{
S s = { 2 };
foo(&s);
return 0;
}
VS2013下输出是
Address of this 0046FA84
Address of other 0046F8E0