【转】 C++中如何在一个构造函数中调用另一个构造函数

时间:2023-01-19 03:50:16

在C++中,一个类的构造函数没法直接调用另一个构造函数,比如:

     #ifndef _A_H_
     #define _A_H_
     #include <stdio.h>
     #include <new>
     class A
     {
     public:
             A()
             {
                     printf("In A::(). m_x=%d\n", m_x);
                     A();
                     printf("Out A::(). m_x=%d\n", m_x);

             }

             A(int x)
             {
                     printf("In A::(int x). x=%d\n", x);
                     m_x=x;
             }

     private:
             int m_x;
     };

这里第11行的调用A(0);只是构建了一个A的临时对象,并没有调用A(int x)来初始化自己。其运行结果是:

[root@tivu25 utcov]# ./UTest.out
In A::(). m_x=
In A::(
Out A::(). m_x=

可以看到尽管调用了A(0),m_x仍然没有改变,是4268020.
正确的方法是使用placement new:

     //A.h
     #ifndef _A_H_
     #define _A_H_
     #include <stdio.h>
     #include <new>
     class A
     {
     public:
             A()
             {
                     printf("In A::(). m_x=%d\n", m_x);
                     );
                     printf("Out A::(). m_x=%d\n", m_x);

             }

             A(int x)
             {
                     printf("In A::(int x). x=%d\n", x);
                     m_x=x;
             }

     private:
             int m_x;
     };

     #endif

第11行应为: new(this) A(0); 也就是用当前对象来调用构造函数A(int x)构建一个“新”对象。其运行结果是:

    [root@tivu25 utcov]# ./UTest.out
    In A::(). m_x=
    In A::(
    Out A::(). m_x=

可以看出,当前对象确实被改变了。