【问题标题】:C++ delegating constructorsC++ 委托构造函数
【发布时间】:2021-08-26 12:36:45
【问题描述】:

你好,我比 C++ 更熟悉 Java

test.h:

class Test
{
private:
int a,b,c;
public Test(int a, int b, int c);
}

test.c

Test::Test(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
Test::Test(int a, int b)
{
this(a, b, 0);
}
Test::Test(int a)
{
this(a, 1)
}
Test::Test()
{
this(2)
}

1 - 我必须在 test.h 中键入每个构造函数签名吗?

2 - 如何编写多个构造函数定义?

3 - 我读到您可以使用默认值在 1 个定义中组合多个构造函数。是怎么做到的

谢谢

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    从 c++11 开始,一个构造函数可以遵循另一个构造函数。因此,如果您想避免在界面中发布默认值,您可以这样做:

    // declaration
    struct X
    {
        X(int a, int b, int c);
        X(int a, int b);
        X(int a);
        X();
    
    private:
        int a,b,c;
    };
    
    // definition    
    X::X(int a, int b, int c)
    : a(a), b(b), c(c)
    {}
    
    
    X::X(int a, int b)
    : X(a, b, 2)
    {
    }
    
    
    X::X(int a)
    : X(a, 1, 2)
    {
    }
    
    X::X()
    : X(0,1,2)
    {
    }
    

    【讨论】:

      【解决方案2】:
      1. 输入它们

      2. 为什么不使用Test(int _a, int _b = 1, int _c = 0);

      定义

      Test::Test(int _a, int _b, int _c) : a(_a), b(_b), c(_c)
      {
      }
      

      即提供默认值并使用基成员初始化?

      这在 C++11 之前也可用

      【讨论】:

        【解决方案3】:

        您的构造函数委托语法错误。您需要使用成员初始化器列表来委托给不同的构造函数:

        Test::Test(int a, int b)
            : Test(a, b, 0)
        {
        }
        Test::Test(int a)
            : Test(a, 1)
        {
        }
        Test::Test()
            : Test(2)
        {
        }
        

        【讨论】:

          【解决方案4】:

          委托构造函数仅在 C++11 中可用。语法如下:

          Test::Test(int a1, int b1, int c1) :
              a{a1}, b{b1}, c{c1}
          {}
          
          Test::Test(int a, int b) :
              Test(a, b, 0)
          {}
          
          Test::Test(int a) :
              Test(a, 1)
          {}
          
          Test::Test() :
              Test(2)
          {}
          

          我还在第一个构造函数中使用了初始化语法。最好这样做,否则成员对象将使用默认构造函数初始化,然后分配一个新值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-16
            • 2010-12-29
            • 1970-01-01
            • 2020-09-02
            • 2012-12-30
            相关资源
            最近更新 更多