说我有以下内容:
catch
通过将引用传递给空函数,或者通过从函数返回typedef struct {
int x;
int y;
char a;
char b;
} myStruct;
来创建具有函数的新myStruct
是更好的做法吗?
myStruct
VS
void init(myStruct* s){
//some code
}
int main(){
myStruct s;
init(&s);
return 0;
}
答案 0 :(得分:3)
这基本上只是惯例。第一种风格在C代码中更常见,第二种在C ++代码中更常见。
在C ++中,他们会说第二个是首选,因为在第一个中,如果你分配其中一个结构但忘记调用init
那么你可能会遇到一个混乱的情况,一个“无头对象”被传递
在C ++中,init
函数通常只是一个构造函数,因此不可能初始化失败。
在C ++中,如果启用优化,效率将没有任何差异,编译器将执行“复制省略”并优化第二个,以使其看起来与第一个类似。
答案 1 :(得分:1)
这取决于你对待初始状态。对于某些人来说,这意味着全部为零,对于其他人来说,这意味着默认状态或有意义的状态。
初始状态的不同定义你有不同的方式去做。
对于归零结构,你只需要
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;
没有收到警告,我个人讨厌返回复杂数据类型的局部变量。< / p>
答案 2 :(得分:0)
我个人经常对简单数据对象使用聚合初始化:
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;
}
答案 3 :(得分:0)
如果你的结构的初始化不能失败,我个人更愿意并建议你只是按价值返回它,因为这是你最终想要的概念性的:让函数从中传递出一些价值范围 - 这正是返回值的设计目的。
如果你的手指习惯于“这种数据类型需要初始化”这种习语,那么你也不太可能忘记
MyStruct foo = init_myStruct();
执行两步“声明和填充”过程。更易于阅读,更易于编写。
还必须注意,指针传递方法不能用于初始化const
- 合格的结构,所以你基本上没有选择,只能返回按价值。