C++类3D vector成员初始化:构造列表与函数体差异及修正
问题原因与解决方法
为什么方式1可行,方式2报错?
- 构造函数初始化列表的作用是在成员变量创建阶段,直接调用其对应构造函数。方式1中,
:v(...)是通知编译器:创建Example对象的v成员时,直接用指定参数调用vector的构造函数完成初始化,完全符合C++对象初始化规则。 - 进入构造函数体时,
v已经被默认构造为一个空的3D vector对象。此时写v(2, ...),编译器会将其解析为“调用名为v的函数并传入参数”,但v是vector对象而非函数,因此触发“找不到匹配函数调用”的编译错误。
构造函数体中初始化的正确写法
有两种常用方式可以在构造函数体内完成v的初始化:
方法1:直接赋值临时对象
通过赋值操作,用临时构造的3D vector覆盖默认构造的空对象:
Example::Example() { v = vector<vector<vector<int>>>(2, vector<vector<int>>(2, vector<int>(2, -1))); }
方法2:使用vector的assign成员函数
assign方法可以直接替换容器内容,传入对应构造参数即可:
Example::Example() { v.assign(2, vector<vector<int>>(2, vector<int>(2, -1))); }
内容的提问来源于stack exchange,提问作者goal Raul
相关产品推荐
相关产品推荐

