1
7
我们定期为聚合类型定义构造函数,没有任何不利影响。事实上,我能想到的唯一不利影响是,在性能关键的情况下,不能避免默认初始化,也不能在联合中使用类型。 可供选择的是初始化的大括号样式
或免费的“制造”功能
前者的问题在于,不能使用它来实例化一个临时函数以传递给函数
在这种情况下,后者是可以的,但是对于懒惰的程序员来说,它的类型要稍微多一些。 后一种形式(make函数)的问题是,它可能会让您忘记初始化数据结构。因为未初始化的变量让我感到很不舒服,所以我更喜欢为聚合类型定义一个构造函数。 std::make_对存在的主要原因实际上不是因为这个原因(std::pair有构造函数),而是因为要调用模板类型的构造函数,必须传递模板参数-这不方便:
最后,在您的示例中,至少应该使构造函数显式
否则,您允许从double向位置隐式强制转换
这可能会导致意外行为。实际上,我将定义两个构造函数,一个初始化为零,另一个初始化为两个值,因为如果没有纬度和经度,位置构造可能没有多大意义。 |
2
5
我通常为结构提供一个构造函数,没有问题。但是,如果构造函数是“非平凡的”,那么该结构就不再被认为是pod类型,并且对您可以使用它做什么有限制。如果这对你来说是一个问题(我从来没有遇到过),那么一个make XXXX函数显然是一个可行的方法。 |
3
2
请注意,如果没有构造函数,以下内容已经满足了您的需要:
|
4
2
从概念上讲,这很好——你不会违背“无行为聚合”的精神。问题是结构不再是pod类型,因此标准对其行为的保证更少,并且不能存储在联合中。 你考虑过这个吗?
|
5
0
自从我提出这个问题以来,我一直在为我的聚合定义构造函数。使用我上面的位置示例,当我这样做时,GCC会抱怨:
警告:扩展初始化列表仅可用-STD= C++0X或-STD= GNU+0X 相反,我必须这样做:
有了这个解决方案,我担心在嵌入式系统中,我的常量表不会存储在flash/rom中。 编辑: 我尝试删除位置构造函数,而pos数组确实已从.bss移动到.rodata段。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |