【问题标题】:How to intitialize const data using constructor如何使用构造函数初始化 const 数据
【发布时间】:2014-01-21 23:09:24
【问题描述】:

您好,我创建了一个具有三个构造函数、两个整数成员和一个 const int 成员的类。因此,对于一个构造函数,我使用初始化列表来分配 const int 成员,但在其他两个构造函数中出现错误

这是我的代码:

class base
{
public:
    base();
    base(const int _count);
    base(int a ,int b);
    ~base();
protected:
    int m_ia , m_ib;
    const int count;
};
base::base()
{
}
base::base(const int _count):count(_count)
{
}
base::base(int a , int b)
{
    m_ia = a ;
    m_ib = b;

}
base::~base()
{

}
void main()
{
    base *obj2 = new base(1000);
    getchar();
}

错误数:2

1.'base::count' : 必须在 base() 的构造函数基/成员初始化列表中初始化

2.'base::count' : 必须在 base(int a ,int b) 的构造函数基/成员初始化列表中初始化

【问题讨论】:

  • ... 以相同的方式在其他 2 个构造函数中初始化 count... 它不会因为您什么都没说就自动将其初始化为 0。
  • void main 不合法。返回类型必须是int。此外,如果base 应该是一个基类,那么该析构函数应该是虚拟的。 obj2 在这个例子中也应该是一个普通的对象。现在,它正在泄漏内存。最后,为什么不为其他成员也使用构造函数初始化列表呢?真的几乎从来没有任何不利的一面。

标签: c++ visual-c++


【解决方案1】:

您可能应该确保所有构造函数都在初始化所有成员变量,而不仅仅是作为参数传入的变量。我会将您的构造函数重写为

base::base()
: m_ia()    // value initializes i.e. sets to 0
, m_ib()
, count()
{
}

base::base(const int _count)
: m_ia()
, m_ib()
,count(_count)
{
}

base::base(int a , int b)
: m_ia(a)
, m_ib(b)
, count()
{
}

如果你有一个支持委托构造函数的 C++11 编译器,你可以创建一个接受 3 个参数的 4 个构造函数,并让其他构造函数委托给那个。

base::base()
: base(0, 0, 0)
{
}

base::base(const int _count)
: base(0, 0, _count)
{
}

base::base(int a , int b)
: base(a, b, 0)
{
}

base::base(int a , int b, int count)
: m_ia(a)
, m_ib(b)
, count(count)
{
}

如果您不希望它成为类接口的一部分,可以将最后一个构造函数设为private

【讨论】:

    【解决方案2】:

    在 c++11 中你可以拥有

    protected:
        int m_ia , m_ib;
        const int count = 0;
    

    它适用于 VS 2013。

    【讨论】:

    • +1 它在 VS2012 中不起作用(也许如果你安装了 CTP,但绝对不是 VS2012 正确的)我忘记了非静态数据成员初始化程序,这是一个比我的答案更好的选择。我还将 m_iam_ib 分配给 0。
    【解决方案3】:

    根据标准 C++ 和您当前的代码,您必须使用初始化列表在构造函数中初始化您的 const 变量,以便可以如下修改代码:

    #include"iostream"
    
    using namespace std;
    
    class base
    {
    public:
        base();
        base(const int _count);
        base(int a ,int b, const int _count);
        ~base();
    protected:
        int m_ia , m_ib;
        const int count;
    };
    base::base():count(0)
    {
    }
    
    base::base(const int _count):count(_count)
    {
    }
    
    base::base(int a , int b, const int _count):count(0)
    {
        m_ia = a; 
        m_ib = b;
    }
    
    base::~base()
    {
    
    }
    int  main()
    {
        base *obj2 = new base(1000);
        getchar();
        return 0;
    }
    

    【讨论】:

    • 为什么我们要在其他两个构造函数中初始化count而不带任何参数
    • 请检查 - "stackoverflow.com/questions/10647448/…" 并阅读课堂上的 const 数据成员,它会让你更清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多