如何使用构造函数初始化const数据

时间:2014-01-04 06:44:04

标签: c++ visual-c++

嗨,我创建了一个有三个构造函数的类,两个整数成员和一个一个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()的构造函数base / member初始化列表中初始化

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

3 个答案:

答案 0 :(得分:4)

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

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编译器,你可以创建一个4构造函数,它接受3个参数并让其他构造函数委托给那个。

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

答案 1 :(得分:3)

在c ++ 11中你可以拥有

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

适用于VS 2013.

答案 2 :(得分:0)

根据标准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;
}