C++自定义Vec3类未编写花括号初始化逻辑仍可正常运行的原因是什么
问题原因解释
你遇到的现象是C++11及以上版本标准中列表初始化规则的正常表现,无需单独编写花括号初始化相关逻辑也能正常运行的核心原因如下:
- 你写的
Vec3 pos = {1,1,0};属于C++的「复制列表初始化」语法,编译器会自动将花括号内的参数列表,匹配类中公开的构造函数入参要求:- 你已经声明了公开的三参数构造函数`Vec3(float x, float y, float z);
- 花括号内的3个整数
1、1、0可以隐式转换为float类型,参数个数、类型完全匹配该构造函数的入参要求,编译器会自动调用这个构造函数完成对象初始化,不需要额外编写专门的花括号初始化逻辑。
- 补充注意事项:
- 如果你给这个三参数构造函数加上
explicit关键字修饰,那么Vec3 pos = {1,1,0};这种复制列表初始化的写法会编译报错,只能用直接列表初始化写法Vec3 pos{1,1,0};才能正常调用该构造函数。 - 你当前类的拷贝构造函数声明为
Vec3(Vec3&);,没有加const修饰符,不符合标准拷贝构造函数的常规声明规范,标准拷贝构造函数应该声明为Vec3(const Vec3&);,否则部分场景下无法正常调用拷贝构造逻辑。 - 你的类内持有
float* data指针成员,需要确保三参数构造函数中正确为data分配3个float大小的堆内存,并将入参的x、y、z值写入对应内存位置,避免出现野指针、内存泄漏等问题。
- 如果你给这个三参数构造函数加上
内容的提问来源于stack exchange,提问作者Demon King
相关产品推荐
相关产品推荐

