通过传递引用或返回引用来初始化结构是更好的风格吗?
Is it better style to initialize a structure by passing a reference or returning it?
假设我有以下内容:
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;
}
和
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};
对于非平凡的初始化,我个人喜欢这样:
struct mystruc s;
if ( mystruc_init(&s) < 0 ) it_is_fail();
IMO,你的第二个方法myStruct s = init();
不强制初始化任何超过上述方法,程序员可能仍然做myStruct s;
没有得到警告,我个人讨厌返回复杂数据类型的局部变量。
如果struct的初始化不能失败,我个人更喜欢并建议您只按值返回它,因为这是您最终想要的概念:让函数传递超出其作用域的一些值-这正是返回值的设计目的。
如果您习惯了"此数据类型需要初始化"这种习惯用法,那么您就不太可能忘记
MyStruct foo = init_myStruct();
比执行两步"声明和填充"过程要好。更容易读,更容易写。
还必须注意的是,指针传递方法不能用于初始化const
限定的结构体,因此,您基本上别无选择,只能按值返回
我个人经常对简单的数据对象使用聚合初始化:
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;
}
- 为什么要使用引用来获取 *char?当我们使用指针时,不使用引用不是更好吗?
- 按引用或值传递链表对象更好吗?
- 防止将临时传递为常量引用的方法,该方法比删除 r 值重载更好地缩放
- 是使用按引用传递来填充容器更好,还是使用返回值来填充容器更好
- 有没有更好/安全的方法将shared_ptr的非常量引用强制转换为基类
- 有没有更好的方法来删除对存储在 vector 中的元素的原始指针引用
- C++,哪种参数样式更好,通过复制还是通过常量引用
- 引用在 c++ 中总是更好的选择
- C++:引用std::map中的计数值;std::multimap是更好的选择吗
- 何时使用引用比指针更好
- 更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
- 这感觉有点反模式,有没有更好的方法(C++ - 分配给引用)
- 通过传递引用或返回引用来初始化结构是更好的风格吗?
- 在c++ 11中,When是比按值传递更好的const引用
- 是否有更好的方法初始化引用成员以引用同一类中的另一个成员
- C++:将枚举作为值传递还是作为常量引用传递更好
- 哪个更好:按值或按常量引用返回std::string
- 哪个是更好的方法 - 将"常量引用"与"boost::<Class>shared_ptr"存储为成员变量
- 引用多级指针的更好方法
- 是按值传递然后移动构造更好,还是按引用传递然后复制构造更好