通过传递引用或返回它来初始化结构是否更好?
说我有以下内容:
typedef struct { int x; int y; char a; char b; } myStruct;
通过将引用传递给空函数,或者通过从函数返回myStruct
,创建具有函数的新myStruct
是更好的做法吗?
void init(myStruct* s){ //some code } int main(){ myStruct s; init(&s); return 0; }
VS
myStruct init(){ myStruct r; //some code return r; } int main(){ myStruct s = init(); return 0; }
它基本上只是惯例。 第一种风格在C代码中更常见,第二种在C ++代码中更常见。
在C ++中,他们会说第二个是首选,因为在第一个中,如果你分配其中一个结构但忘记调用init
那么你可能会遇到一个令人困惑的情况,传递“无头对象”。
在C ++中, init
函数通常只是一个构造函数,因此不可能初始化失败。
在C ++中,如果启用优化,效率将没有任何差异,编译器将执行“复制省略”并优化第二个,以使其看起来与第一个类似。
这取决于你对待的初始状态。 对于某些人来说,这意味着全部为零,对于其他人来说,这意味着默认状态或有意义的状态。
初始状态的不同定义你有不同的方式去做。
对于归零结构,你就是这样做的
struct mystruc s = {0};
如果结构需要特定的值初始化,它可能看起来像:
struct mystruc s = {1, 2, NULL, 0x1234};
对于非trival初始化,我个人喜欢这样:
struct mystruc s; if ( mystruc_init(&s) < 0 ) it_is_fail();
IMO,你的第二个方法myStruct s = init();
除上述方法之外,不执行初始化,程序员仍然可以执行myStruct s;
没有得到警告,我个人讨厌返回复杂数据类型的局部变量。
如果你的struct的初始化不会失败,我个人更喜欢并建议你只是按值返回它,因为这是你最终想要的概念:让函数从它的范围中提供一些值 – 这正是返回一个值是什么专为。
如果你的手指习惯于“这种数据类型需要初始化”这种习语,那么你也往往会忘记这种情况。
MyStruct foo = init_myStruct();
而不是执行两步“声明和填充”过程。 易于阅读,更易于编写。
还必须注意的是,指针传递方法不能用于初始化const
-qualified结构,所以你基本上没有选择,只能按值返回。
就个人而言,我经常对简单数据对象使用聚合初始化:
struct MyStruct { int x; int y; char a; char b; }; int main() { MyStruct s = {10, 20, 'e', 'u'}; }
或硬编码默认值如下:
struct MyStruct { int x; int y; char a; char b; }; const MyStruct MyDefault_A = {0, 0, 'a', 'z'}; const MyStruct MyDefault_B = {10, 20, 'e', 'u'}; int main() { MyStruct s = MyDefault_A; }