通过传递引用或返回它来初始化结构是否更好?

说我有以下内容:

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; }