我现在对构造函数到底执行哪些操作感到很困惑。张国峰写的《C++语言及其程序设计教程》中的观点就是:构造函数是在对象产生之后被调用的第一个函数,将对象初始化为一个特定的状态。也就是说构造函数只完成初始化的作用;但是钱能的《C++程序设计教程》中说构造函数完成了为对象申请内存空间、初始化这两个功能。钱能对构造函数的这个解释我非常疑惑。
内存空间的开辟是由构造函数来做的吗?望各位仁兄指教,或者推荐一本对对象构造过程有详细解释的权威书籍。谢谢,谢谢!

解决方案 »

  1.   

    构造函数只完成初始化的作用;
    申请内存空间云云,也许只是为了与传统C的实现方式进行对比,突出优点:
    如果您想在c环境下实现类似"封装"的思想,就要自己用函数实现内存管理和初始化,且要自己调用实现这两种功能的函数。
    在c++中内存分配省去了,初始化却不能省。
      

  2.   

    比如对于如下的代码:
    class C
    {...
    }main()
    {
    C m_MyObj;
    }
    那么main中MyObj的sizeof(m_MyObj)空间是怎样申请来的呢?
      

  3.   

    比如对于如下的代码:
    class A
    {...
    };
    class B
    {...
    };
    class C:public A
    {
    B m_obj1;
    ...
    }main()
    {
    C m_MyObj;
    }当执行main函数中的C m_MyObj;这条语句时,钱能的大体解释是:1 首先调用m_MyObj的构造函数,但并不进入函数体中,而是先为m_MyObj申请一块sizeof(C)大小的内存空间,并使m_MyObj的this指针指向该内存块的首地址。
    2 此时仍不进入m_MyObj构造函数体中,而是调用class A构造函数,class A的构造函数先在m_MyObj划出的内存空间中划出自己的一块,然后执行自己的构造函数体。
    3 接着,class B的构造函数被调用,同样的也是先在m_MyObj划出的内存空间中划出自己的一块,然后执行自己的构造函数体。
    4 最后进入m_MyObj;自己的构造函数体中,执行函数体中的语句。
    5 此条语句执行结束。
    当然,钱能并没有举这个例子,但照他对构造函数的解释,大体就是这样。
      

  4.   

    C m_MyObj;
    声明对象,自然就分配了内存,这应该是c++语法基本功能。我的理解是,内存sizeof(C)一次性就分配好了,而不是再来两次sizeof(B)、sizeof(C)的分配操作。
    而从类C到B到A,构造函数依次执行,只是实现了一种初始化工作的自动调用机制。
      

  5.   

    mrlp:
    我原来也一直是这样认为的,但钱能的书上是这样介绍的:class A
    {
    ...
    };class B
    {
    ...
    };class C
    {
    int m_1;
    A m_2;
    B m_3;
    };main()
    {
    C m_obj;
    }
    主函数main()运行开始时,遇到要创建C类的对象这条语句,于是调用其构造函数C(),该构造函数启动时,首先分配对象空间(包括一个类A对象,一个类B对象和一个int 型数据),然后根据在类中声明的对象成员的次序依次调用其构造函数。这里先调用A的构造函数,在调用B的构造函数,最后执行自己的构造函数的函数体。
    以上就是钱能对构造函数的一段解释。可以看出,意思就是说:对象的空间是在构造函数启动后,进入构造函数体之前分配的,也就是先调构造函数,再为分配对象空间。我现在最想看看《The C++ Programing Language》、《C++ Pr》这样的书上是怎么说的,可惜我手上没这些书。哪为朋友能给个确切的答案,不要想当然。
      

  6.   

    mrlp:
    我原来也一直是这样认为的,但钱能的书上是这样介绍的:class A
    {
    ...
    };class B
    {
    ...
    };class C
    {
    int m_1;
    A m_2;
    B m_3;
    };main()
    {
    C m_obj;
    }
    主函数main()运行开始时,遇到要创建C类的对象这条语句,于是调用其构造函数C(),该构造函数启动时,首先分配对象空间(包括一个类A对象,一个类B对象和一个int 型数据),然后根据在类中声明的对象成员的次序依次调用其构造函数。这里先调用A的构造函数,在调用B的构造函数,最后执行自己的构造函数的函数体。
    以上就是钱能对构造函数的一段解释。可以看出,意思就是说:对象的空间是在构造函数启动后,进入构造函数体之前分配的,也就是先调构造函数,再为分配对象空间。我现在最想看看《The C++ Programing Language》、《C++ Pr》这样的书上是怎么说的,可惜我手上没这些书。哪为朋友能给个确切的答案,不要想当然。
      

  7.   


    这个钱能是个狗屎,看多了他的书自己也会变狗屎,是个无聊的骗钱的人。在分配空间上C++的class与c中的struct是一样的。class的空间大小是指它所有的数据成员的大小,如果类中有虚函数,则要加上一个vtable指针所占有空间大小4个字节。如果类的实例是栈中的局部变量,编译器会根据sizeof(class)的大小在栈中分配空间,简单的将ESP减去sizeof(A)而已。如果是堆中创建实例,编泽器调用操作系统提供的堆空间分配函数来分配空间。空间分配与构造函数没有任何关系。空间分配完毕后,编译器会调用类的构造函数来初始化刚才分配的空间。写一个简单的类,把它编译成汇编代码不就知道了。
      

  8.   

    可能钱能的意思是在构造函数中为那些成员变量为指针的开辟内存空间。
    如:
    class My
    {
    public:
      int *pInt;
    }
    那么构造函数得给这个成员变量开辟空间。My::My()
    {
      pInt=new int;
    }对象的空间应该是由系统来分配的。不是在构造函数中自己分配。
      

  9.   

    但愿钱能是这个意思吧!
    有兴趣的朋友可以看一看钱能的书的P268、P279、p281、P284、P288这些页,是他对构造函数的一些解释。大家看一看他的解释到底对不对。