返回信息流### 最近在学习C++,发现一大堆初始化类型, 有点懵逼
比如说
- `aggregate initialization` // A a{1,2,3,4};
- `list-initialization` // A a{1,2,3,4};
- `default initialization` // A a;
- `Value-initialization` // A a{} 或者 A a();// 这个为什么叫 Value-initialization, 这也没传值啊
- `Direct initialization` // A a(1);
- 等等
上面有些形式上是一样的,效果好像也是一样的,为什么初始化类型要搞这么多?
这些初始化类型是包含与被包含的关系,还是非此即彼的关系?
这是一条镜像帖。来源:北邮人论坛 / cpp / #101961同步于 2022/6/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】C++初始化类型和语法
YiYeShu
2022/6/8镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
一部分因为历史的包袱,另一部分因为另一段历史的包袱。c++17之后推荐第一种
【 在 YiYeShu 的大作中提到: 】
: [md]
: ### 最近在学习C++,发现一大堆初始化类型, 有点懵逼
: ............
学Rust吧。每种结构就一种初始化。
struct Foo;
只能let foo = Foo;
struct Foo(i32, f32);
只能let foo = Foo(1, 2.0);
struct Foo { x: i32, y: f32 };
只能let foo = { x: 1, y: 2.0 };
需要自定义的话就只能自己定义工厂方法:
impl Foo {
pub fn new(x: i32, y: f32) -> Self {
Self {
x, // x字段的值就是局部变量x
y, // y字段的值就是局部变量y
}
}
pub fn with_default_y(x: i32) -> Self {
Self {
x, // x字段的值就是局部变量x
y: 0.0,
}
}
}
let foo1 = Foo::new(1, 2.0);
let foo2 = Foo::with_default_y(1);
也不需要你想太多,反正就这一种方法。
【 在 YiYeShu 的大作中提到: 】
: [md]
: ### 最近在学习C++,发现一大堆初始化类型, 有点懵逼
: 比如说
: ...................
C++委员会为了统一初始化语法费了老大劲了,但还是有些例外没能覆盖到,可以看看C++之父的论文。