c – 构造函数中的数组
发布时间:2020-12-16 09:38:21 所属栏目:百科 来源:网络整理
导读:以下代码中会发生什么? 如果我想在b数组中添加一些内容,我认为它不起作用,因为我得到了一个分段错误,但我到底做了什么呢? 有没有办法在构造函数中指定数组的大小? class A { public: A() { b[3]; } private: B b[];}; 解决方法 B b []这里是一个“ flexib
以下代码中会发生什么?
如果我想在b数组中添加一些内容,我认为它不起作用,因为我得到了一个分段错误,但我到底做了什么呢? 有没有办法在构造函数中指定数组的大小? class A { public: A() { b[3]; } private: B b[]; }; 解决方法
B b []这里是一个“
flexible array member”,你的编译器中的非标准扩展(取自C99),它允许你声明一个无界数组作为一个类型中的最后一个成员.它仅在使用老式的C方式分配对象时(当你将参数填充到malloc以为数组腾出空间时),并且应该避免使用它.在这种情况下,你还没有为数组分配任何额外的内存,所以在你的构造函数体中,当你试图访问3’元素’之后发生的事情时,你正在调用UB.我将忽略其余答案的扩展名,因为它在C代码中确实没有位置.
不,没有. 数组边界必须在编译时知道,因此在ctor体中你不会比在类定义中知道更多;您需要在成员的声明中编写维度: class A { B b[3]; }; 如果维度是程序中的运行时数量,则需要存储指针,并在构造函数中将其指向动态内存块: class A { public: A() : b(new B[3]) {} ~A() { delete[] b; } private: B* b; // same as `B b[]`! but far clearer }; 相反,我建议使用std :: vector: class A { public: A() : b(3) {} private: std::vector<B> b; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |