类组合涉及初始化问题
下面代码中,类B里组合了类A,运行时会报错,
class A { public: A(int _a) { a = _a; cout << "构造函数" << "a" << a << endl; } ~A() { cout << "析构函数" << "a" << a << endl; } protected: private: int a; }; class B { public: protected: private: int b1; int b2; A a2; A a1; }; void obj10play() { A a1(10); B ojbB; return ; } void main() { obj10play(); system("pause"); }
出错根源在于给类B分配内存时,因含有类A作为类B成员变量的一部分,个人认为,类A中已有有参构造函数,类B中定义的类A带无参数,是无法执行类A的构造函数的,就是说无法找到类A的入口,那类B就无法完成创建内存,这样改,把类A有参数构造函数变成无参构造函数:
class A { public: A() { cout << "构造函数" << "a" << a << endl; } ~A() { cout << "析构函数" << "a" << a << endl; } protected: private: int a; }; class B { public: protected: private: int b1; int b2; A a2; A a1; }; void obj10play() { A a1(); B ojbbB; return; } void main() { obj10play(); system("pause"); }
唉,果然运行是正常的,问题来了,你无法用类B来给类A做初始化,感觉没什么意义,C++提供了这样一个语法,constructor:m1(v1),m2(v2),m3(v3) 。下面为修改后:
class A { public: A(int _a) { a = _a; cout << "构造函数" << "a" << a << endl; } ~A() { cout << "析构函数" << "a" << a << endl; } protected: private: int a; }; class B { public: B(int _b1, int _b2) : a1(1), a2(2), c(0) { } B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0) { b1 = _b1; b2 = _b2; cout <<"B的构造函数"<<endl; } ~B() { cout<<"B的析构函数" <<endl; } protected: private: int b1; int b2; A a2; A a1; const int c; }; void obj10play() { A a1(10); B ojbB(1, 2); B ojbB2(1, 2,3, 4); return ; } void main() { obj10play(); system("pause"); }
这样,问题就解决了,本质上,我觉得还是构造函数参数的对称问题,,,,,,,,
constructor:m1(v1),m2(v2),m3(v3) 这样的语法,它执行的顺序是按照类中成员变量的排序顺序来执行的,而非此语法的排序顺序决定。完毕。