C++ 成员类 (类里面包含另一类的对象) 构造函数调用有关问题
C++ 成员类 (类里面包含另一类的对象) 构造函数调用问题
各位高手,本菜鸟在阅读他人代码的时候,遇到了一个“成员类”
(类里面包含另一个类的对象) 的构造函数调用问题,具体问题如下:
问题: A中的构造函数会被调用么? 为什么?
程序运行结果:
in A Default Constructor : mInt = 0
in B Default Constructor
in setIntVal : mInt = 0 mSet = 20
本人属C++菜鸟一枚,以前是搞C的。自己写C++的时候,如果需要调用
A类的构造函数,会通过在B类的构造函数那里去“显示调用”,比如通过
构造函数的初始化列表,或者去new一个A类的对象。但对于这种“隐式”的
处理,小弟就看不懂了。
弱问下: 这个运行结果,与A类定义,实现的无参构造函数也有关吧? 要是
换成有参数的就不行了吧? 这种无参数的构造函数,是这种情况下默认
调用的构造函数吗?
如果方便,还请高手释疑后顺便给个相关知识点的参考链接,小弟再参考参考。
求各位大大指点了,万分感谢!!!
------解决方案--------------------
只要有“创建”(非专业的叫法)对象的过程,对象类的构造函数的调用不可避免(除非类的作者没有显式提供
B类构造函数中不写对aObj的构造,相当于其实写了": aObj()"。就算你故意不懈B类的构造函数,就是因为aObj有个自定义的构造函数而会导致编译器暗中给你生成一个B()并且用其调用aObj()
------解决方案--------------------
class B有一个member: A aObj;
那构造B对象时,肯定会先构造A对象,就肯定会调用A的构造函数。
------解决方案--------------------
楼主,想在C++的路上走远一点,自己认认真真啃下一本合格的教材是最低要求的。
不要想偷懒啊。
------解决方案--------------------
1.这个运行结果,与A类定义,实现的无参构造函数也有关吧?
肯定有关,因为B中包含A,所以在构造B时会先构造A
2.要是换成有参数的就不行了吧?
这要看A中是否提供了默认构造函数,
如果A没有提供默认构造函数,并且用户声明了一个带参数的构造函数,那么编译器不会合成出一个默认的出来,所以在B的初始化列表中需要显示提供构造A所需的参数。
相反,如果A的众多构造函数里有一个默认构造函数,那么B的构造函数中就算没有显示调用A的,编译器也会帮我们调用
------解决方案--------------------
请阅读C++ primer 第十一章 十二章,你想知道的,里面都有;我这有电子版,想要的话可以给你
------解决方案--------------------
我vs2010实测结果是:
new B()时候怎么会先去给A的成员赋值? 楼主肯定哪里搞错了吧?
------解决方案--------------------
各位高手,本菜鸟在阅读他人代码的时候,遇到了一个“成员类”
(类里面包含另一个类的对象) 的构造函数调用问题,具体问题如下:
#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;
}
问题: A中的构造函数会被调用么? 为什么?
程序运行结果:
in A Default Constructor : mInt = 0
in B Default Constructor
in setIntVal : mInt = 0 mSet = 20
本人属C++菜鸟一枚,以前是搞C的。自己写C++的时候,如果需要调用
A类的构造函数,会通过在B类的构造函数那里去“显示调用”,比如通过
构造函数的初始化列表,或者去new一个A类的对象。但对于这种“隐式”的
处理,小弟就看不懂了。
弱问下: 这个运行结果,与A类定义,实现的无参构造函数也有关吧? 要是
换成有参数的就不行了吧? 这种无参数的构造函数,是这种情况下默认
调用的构造函数吗?
如果方便,还请高手释疑后顺便给个相关知识点的参考链接,小弟再参考参考。
求各位大大指点了,万分感谢!!!
------解决方案--------------------
只要有“创建”(非专业的叫法)对象的过程,对象类的构造函数的调用不可避免(除非类的作者没有显式提供
任何构造函数)
B类构造函数中不写对aObj的构造,相当于其实写了": aObj()"。就算你故意不懈B类的构造函数,就是因为aObj有个自定义的构造函数而会导致编译器暗中给你生成一个B()并且用其调用aObj()
------解决方案--------------------
class B有一个member: A aObj;
那构造B对象时,肯定会先构造A对象,就肯定会调用A的构造函数。
------解决方案--------------------
楼主,想在C++的路上走远一点,自己认认真真啃下一本合格的教材是最低要求的。
不要想偷懒啊。
------解决方案--------------------
1.这个运行结果,与A类定义,实现的无参构造函数也有关吧?
肯定有关,因为B中包含A,所以在构造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的,编译器也会帮我们调用
------解决方案--------------------
请阅读C++ primer 第十一章 十二章,你想知道的,里面都有;我这有电子版,想要的话可以给你
------解决方案--------------------
我vs2010实测结果是:
in A Default Constructor : mInt = -842150451
in B Default Constructor
in setIntVal : mInt = 0 mSet = 20
Press any key to continue . . .
new B()时候怎么会先去给A的成员赋值? 楼主肯定哪里搞错了吧?
------解决方案--------------------
A()
{
cout << " in A Default Constructor : mInt = " << mInt << endl;
mInt = 0;
}
这里很纳闷为什么先输出后赋值的情况下mInt还是会等于0?不应该是乱码吗?
这个我觉得没错啊!因为mInt在静态时候就已经完成了赋值,你在建立new B()时候应该就已经完成赋值了,这是我的理解
我vs2010实测结果是:in A Default Constructor : mInt = -842150451
in B Default Constructor