可能重复:
pointer as second argument instead of returning pointer?
我看到了很多:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
让init函数返回指针会不会更清晰?
Monkey* test = Monkey_New();
为什么经常以第一种方式完成?
答案 0 :(得分:7)
这两种设计在功能上极为不同。你问的问题会给调用者带来分配的负担。这具有巨大的优势,即如果对象不必超出调用者的位置,则可以避免动态存储(malloc
);它可以存储在自动变量中。这也意味着,假设init函数不必获取更多资源,您可以使用无故障API,其中调用者不必检查失败。另一方面,它要求结构的定义(至少大小)暴露给调用模块,这意味着如果更新库代码以使用更大尺寸的对象,则必须重新编译调用者;因此,对于具有长期稳定ABI的共享库,它可能是负面的。
在您指出的替代设计中,获取存储的负担在被调用者(库函数)上,并且必须使用动态存储(malloc
),因为自动存储将无法在返回调用者后继续存在。这更抽象,更清洁,
答案 1 :(得分:-1)
这完全取决于开发人员使用的命名约定。考虑到这一点:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Default_Constructors
对于c ++和c,告诉你使用new并使用参数来帮助初始化,返回初始化的值。在过去,情况并非如此,因为当时它是一个狂野的世界。为了体面,请使用Monkey_New();