64,651
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
class A {
public:
int mInt;
A()
{
cout << " in A Default Constructor : mInt = " << mInt << endl;
mInt = 0;
}
void setIntVal(int mSet)
{
cout << " in setIntVal : mInt = " << mInt << " mSet = " << mSet << endl;
if(mInt < mSet)
{
mInt = mSet;
}
}
};
class B {
private:
int b;
A aObj;
public:
B()
{
cout << " in B Default Constructor" << endl;
b = 10;
aObj.setIntVal(20);
}
};
int main() {
// your code goes here
B * pB = new B();
delete pB;
return 0;
}
in A Default Constructor : mInt = -842150451
in B Default Constructor
in setIntVal : mInt = 0 mSet = 20
Press any key to continue . . .
new B()时候怎么会先去给A的成员赋值? 楼主肯定哪里搞错了吧?[/quote]
的确是我理解错了一个地方,我没注意构造函数,是我的错误,不好意思 in A Default Constructor : mInt = -842150451
in B Default Constructor
in setIntVal : mInt = 0 mSet = 20
Press any key to continue . . .
new B()时候怎么会先去给A的成员赋值? 楼主肯定哪里搞错了吧?
B()//B的构造函数,虽然没有显示调用A的ctor,但是相当于在初始化列表中有个aObj()
{
cout << " in B Default Constructor" << endl;
b = 10;
aObj.setIntVal(20);
}
2.要是换成有参数的就不行了吧?
这要看A中是否提供了默认构造函数,
如果A没有提供默认构造函数,并且用户声明了一个带参数的构造函数,那么编译器不会合成出一个默认的出来,所以在B的初始化列表中需要显示提供构造A所需的参数。
相反,如果A的众多构造函数里有一个默认构造函数,那么B的构造函数中就算没有显示调用A的,编译器也会帮我们调用任何
构造函数)
B类构造函数中不写对aObj的构造,相当于其实写了": aObj()"。就算你故意不懈B类的构造函数,就是因为aObj有个自定义的构造函数而会导致编译器暗中给你生成一个B()并且用其调用aObj()