【问题标题】:Calling Constructor with in constructor in same class在同一个类的构造函数中调用构造函数
【发布时间】:2023-04-03 19:20:01
【问题描述】:

我期待输出 2、3,但我得到了垃圾值。这是为什么呢?

这是我的代码:

#include <iostream>
using namespace std;

class A
{
public:
    int a, b;

    A()
    {
        cout << a << " " << b;
    }

    A(int x, int y)
    {
        a = x;
        b = y;
        A(); // calling the default constructor
    }
};

int main()
{
    A ob(2, 3);
    return 0;
}

【问题讨论】:

    标签: c++ constructor garbage


    【解决方案1】:

    在这个构造函数内部:

    A(int x, int y)
    {
        a = x;
        b = y;
        A(); // calling the default constructor
    }
    

    调用A(); 创建一个新的临时对象,该对象在此语句之后立即被删除。因为默认构造函数A()没有初始化数据成员ab所以输出一个垃圾。

    这个临时对象与构造函数A( int, int )创建的对象没有任何共同之处。

    您可以通过以下方式重写您的课程:

    class A
    {
    public:
        int a, b;
    
        A(): A(0, 0) {}
    
        A(int x, int y) : a(x), b(y)
        {
            cout << a << " " << b;
        }
    };
    

    【讨论】:

    • 为什么可以创建临时匿名对象?
    • @zenith 为什么不呢?也许它有一些副作用。
    • @zenith:“临时匿名”没有意义。如果一个对象有名字,它就不是临时的。
    • @KerrekSB 我的意思是“临时”,因为它会立即被删除。
    • @zenith:确实,一个有名字的对象不会被立即删除,只会在它的名字超出范围时被删除。
    【解决方案2】:

    您没有调用默认构造函数,您所做的是创建一个临时 A 对象,该对象恰好在您打印输出之前其成员未初始化。也许你想做的是构造函数委托,它看起来像

    #include <iostream>
    
    class A
    {
        int a, b;
    public:
        A(): A( 0, 0 ) {
            std::cout << a << ", " << b << std::endl;
        }
        A( int x, int y ): a( x ), b( y ) {}
    }
    
    int main()
    {
        A object_a {}; //prints 0, 0
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      这里输出未初始化的 a 和 b:

      A(){
      cout<<a<<" "<<b;
      }
      

      这里你初始化了a和b,但是你创建了一个anonlymous临时对象

      A(int x , int y){
          a = x; b= y;
          A(); // !!!! CREATES AT TEMPORARY ANONYMOUS OBJECT WITH IT'S OWN a and B
      }
      

      要使用委托构造函数(即使用另一个构造函数来完成 SAME 对象的构造过程),您必须在初始化列表中使用委托构造函数:

      A(int x , int y) : A() { a=x; b=y;  } 
      

      很遗憾,当您使用委托时,委托必须是列表中唯一的初始化器。这要求 a 和 b 的初始化发生在 A() 之后。

      另一种选择:

      class A
      {
      public:
          int a, b;
          A() :  A(0, 0) { }  // use a delegated ctor 
          A(int x, int y) : a(x), b(y) { cout << a << " " << b; }
      };
      

      还有另一种选择,使用默认值(不重用构造函数):

      class A
      {
      public:
          int a, b;
          A(int x=0, int y=0) : a(x), b(y) { cout << a << " " << b; }
      };
      

      【讨论】:

        猜你喜欢
        • 2014-08-01
        • 2014-03-12
        • 2012-06-22
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多