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

时间:2015-09-13 05:26:15

标签: c++ c pointers struct initialization

说我有以下内容:

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

4 个答案:

答案 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 - 合格的结构,所以你基本上没有选择,只能返回按价值。