您的位置:程序门 -> c/c++ -> c++ 语言



c++ 中的一个构造函数的调用问题请教


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


c++ 中的一个构造函数的调用问题请教
发表于:2008-01-22 11:19:39 楼主
本人菜鸟,刚学c++。编程遇到一个问题,望高手不吝赐教。
源程序:
  include   <iostream.h>

class   a  
{
protected:
int   a1;
int   a2;
public:

a(int   x1=0,int   x2=0):a1(x1),a2(x2)           //a类构造函数
{
cout < <"类a构造函数调用" < <endl;
}

~a(void)                     //a类析构函数                            
{
cout < <"类a的析构函数调用" < <endl;
}
};

class   b:   public   a  
{
public:
int   b1;
int   b2;
public:
b(int   x1=0,int   x2=0,int   y1=0,int   y2=0): b1(y1),b2(y2)         //b类构造函数
{  
  cout < <"类b构造函数调用" < <endl;
}

~b(void)           //b类析构函数
    {
                    cout < <"类b的析构函数调用" < <endl;
    }

int   get(void)
{return   a2;
}
};

void   main()
{
b   myb(2,3,4,5);
cout < <"a2=" < <myb.get() < <endl;
}
运行结果:
          类a构造函数调用
          类b构造函数调用
          a2=0
          类b的析构函数调用
          类a的析构函数调用
          press   any   key   to   continue
问题:1、   在b类的构造函数中,并没有显示调用a类的构造函数,为什么在定义了b类的对象之后,调用b类的构造函数时要先调用a类的构造函数呢?
              2、如果在b1(y1),b2(y2)之前添加a(x1,x2),结果除了a2变了之外,为什么同样要调用a类的构造函数?这和不添加a(x1,x2),在a类的构造函数调用上有什么区别吗?
      谢谢!
发表于:2008-01-22 11:33:561楼 得分:0
1.因为b   是a的子类。所以默认的会调用a的构造函数。

2.b1(y1),b2(y2)..是个初始化列表

b(int       x1=0,int       x2=0,int       y1=0,int       y2=0):a(x1,x2),   b1(y1),b2(y2)   的话。
在main函数中,传入的参数是   2,3,4,5,如果加入a(x1,x2),就是调用a(2,3);

b(int       x1=0,int       x2=0,int       y1=0,int       y2=0):   b1(y1),b2(y2)
a调用的是默认的构造函数。a(0,0);


发表于:2008-01-22 11:34:462楼 得分:0
没有什么很大的区别。就是可以传入不同的参数。
发表于:2008-01-22 12:10:413楼 得分:0
“因为b是a的子类。所以默认的会调用a的构造函数”,我认为这句话很关键。
谢谢“wuyu637”!
发表于:2008-01-22 14:23:184楼 得分:0
你要知道派生类的组成部分.
它是由基类的子对象部分,即非静态数据成员部分,跟派生类的部分组成.
因此,在构造时先从基类开始.如果基类中也有基类,则依此类推.
如果你没显式调用的话,则编译器调用缺省的构造函数.
因为你的类a中的构造函数可以缺省调用,即不用提供参数,所以可以调用.
你可以试下,不要缺省参数,这样a的构造函数就不可以缺省地被调用.这时,你的b类构造就不成功了.
因为没有缺省构造函数可用.
发表于:2008-01-22 18:19:135楼 得分:0
子类初始化时都先调用父类的构造函数!


快速检索

最新资讯
热门点击