Компания, в которой я работаю, инициализирует все свои структуры данных с помощью функции инициализации следующим образом:
//the structure
typedef struct{
int a,b,c;
} Foo;
//the initialize function
InitializeFoo(Foo* const foo){
foo->a = x; //derived here based on other data
foo->b = y; //derived here based on other data
foo->c = z; //derived here based on other data
}
//initializing the structure
Foo foo;
InitializeFoo(&foo);
Я получил некоторый толчок назад, пытаясь инициализировать мои структуры следующим образом:
//the structure
typedef struct{
int a,b,c;
} Foo;
//the initialize function
Foo ConstructFoo(int a, int b, int c){
Foo foo;
foo.a = a; //part of parameter input (inputs derived outside of function)
foo.b = b; //part of parameter input (inputs derived outside of function)
foo.c = c; //part of parameter input (inputs derived outside of function)
return foo;
}
//initialize (or construct) the structure
Foo foo = ConstructFoo(x,y,z);
Есть ли преимущество одного над другим?
Что я должен сделать, и как бы я оправдал это как лучшую практику?
InitializeFoo()
- конструктор. Единственное отличие от конструктора C ++ состоит в том, что this
указатель передается явно, а не неявно. Скомпилированный код InitializeFoo()
и соответствующий C ++ Foo::Foo()
абсолютно одинаковы.