如何在组合类的成员初始化列表中初始化部件类数组?未初始化该数组代码是否可运行?
组合类中初始化部件类数组的解决方案
嘿,我来帮你理清这个问题!针对你的两个疑问,我一步步给你解释:
1. 如何在类B的构造函数成员初始化列表中初始化部件类数组arr
在C++11及之后的标准里,我们可以直接用列表初始化语法在成员初始化列表中给数组的每个元素指定构造参数。结合你的代码,修改B的构造函数如下:
B( int value = 5 ) : aM(0), arr{1, 2, 3, 4, 5} // 给数组每个元素传入不同的初始化值 { b = value ; }
如果想把数组所有元素都初始化为同一个值(比如全0),可以写成:
B( int value = 5 ) : aM(0), arr{0, 0, 0, 0, 0} { b = value ; }
要是你还在使用C++03或更早的标准,那没法直接在初始化列表里初始化数组元素,只能在构造函数体内通过循环调用成员方法来设置值,比如:
B( int value = 5 ) : aM(0) { b = value ; // 循环给数组每个元素赋值 for (int i = 0; i < 5; ++i) { arr[i].setA(i + 1); // 这里可以自定义每个元素的初始值 } }
2. 不在成员初始化列表中初始化该数组,代码能否正常运行?
这取决于你的部件类A是否有默认构造函数。
在你的示例代码里,A的构造函数是A(int value = 0)——这个带默认参数的构造函数等价于提供了默认构造(可以无参调用A())。所以当创建B的对象时,数组arr的5个A对象会自动调用默认构造函数完成初始化,每个元素的a成员都会被设为0,代码是可以正常运行的(不过你的printB里有个小问题:cout << arr[i]这行编译会出错,因为std::cout不知道如何输出A类对象,你需要改成cout << arr[i].a,或者给A重载operator<<运算符)。
但如果A没有默认构造函数(比如把构造函数改成A(int value),去掉默认参数),那编译器会报错——因为它没法自动初始化数组里的A对象,这时你必须在成员初始化列表里显式初始化数组(C11+),或者在构造函数体内手动初始化每个元素(C03及更早)。
最后给你一个修正后的完整示例代码,包含初始化列表初始化数组和正确的输出:
#include <iostream> using namespace std ; class A //part class { public: A( int value = 0) { a = value ; } void printA() { cout << "\nPrinting A members : " << a << endl ; } void setA( int value) { a = value ; } // 重载<<运算符,方便直接输出A对象 friend ostream& operator<<(ostream& os, const A& obj) { os << obj.a; return os; } protected: int a ; }; class B //whole class { public: // 使用初始化列表初始化数组arr B( int value = 5 ) : aM(0), arr{10, 20, 30, 40, 50} { b = value ; } void printB() { cout << "\nPrinting B members : " << b << endl ; aM.printA() ; cout << "\nPrinting arr elements: "; for (int i = 0 ; i < 5 ; i++) cout << arr[i] << " , " ; } private: int b ; A aM ; //composition A arr[5] ; }; int main() { B objB ; objB.printB() ; return 0 ; }
内容的提问来源于stack exchange,提问作者z gillani
相关产品推荐
相关产品推荐

