C++在一个类中定义另一个有参数构造函数的类的对象

class A
{
public:    
  A( int i ){}
};
class B {
public:    
  B():a(1){}   
//或:B( int i ):a( i ){ }。对a提供参数一定要按                  
//这种形式,在冒号后,不能在花括号里面!
private:    
  A a;
};
void main()
{    
  B b;
}
注意: 在B中定义 A a; 是可以通过的,但在其他地方(比如函数中)这样是不对的。 在B中定义 A a; 只是告诉编译器:“B有一个A类的对象”,并不在定义的时候创建a这个对象成员,也就不考虑它的构造函数。a这个对象成员的创建是在执行B的构造函数时进行的,B的构造函数后面必须以初始化表的形式为a对象成员提供参数,比如 B( ) : a( 1 ) { } 如果在构造函数中不为a提供参数,会发生错误。 在其他地方(比如函数中)定义A的对象时,必须定义成 A a(参数);的形式。因为定义时就要创建A的对象,所以要考虑它的构造函数。
分析:我猜测类中定义的所有对象(包括基本类型的数据对象、无参类对象等等)的构造都是在此类的初始化列表中进行的,只不过无参和基本类型的对象被省略了。在构造函数体内的所谓初始化,只是给已经生成的对象重新赋值罢了,并没有进行对象的构造。 就是说对象构造必须在初始化列表里。 (如有错误,欢迎指正)

猜你喜欢

转载自blog.csdn.net/syb1295306116/article/details/80896306