C++ 如何使用构造函数初始化常量数据

C++ 如何使用构造函数初始化常量数据,c++,visual-c++,C++,Visual C++,嗨,我创建了一个类,它有三个构造函数,两个整数成员和一个常量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;

嗨,我创建了一个类,它有三个构造函数,两个整数成员和一个常量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/成员初始值设定项列表中的base(int a,int b)处初始化。

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

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)
{
}

如果您不希望最后一个构造函数成为类接口的一部分,则可以将其设置为私有的。

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

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)
{
}
如果您不想让最后一个构造函数成为类接口的一部分,那么可以将其设置为私有的。

在c++11中,您可以使用

protected:
    int m_ia , m_ib;
    const int count = 0;
它在VS2013中工作。

在c++11中,您可以

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

它在VS 2013中工作.

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

按照标准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;
}

... 以相同的方式初始化其他2个构造函数中的
count
。。。它不会仅仅因为你什么都没说就自动将其初始化为0。
void main
是不合法的。返回类型必须是
int
。另外,如果
base
应该是基类,则析构函数应该是虚拟的<代码>obj2在本例中也应为普通对象。现在,它正在泄漏内存。最后,为什么不为其他成员使用构造函数初始值设定项列表呢?几乎没有什么不好的一面。。。。以相同的方式初始化其他2个构造函数中的
count
。。。它不会仅仅因为你什么都没说就自动将其初始化为0。
void main
是不合法的。返回类型必须是
int
。另外,如果
base
应该是基类,则析构函数应该是虚拟的<代码>obj2在本例中也应为普通对象。现在,它正在泄漏内存。最后,为什么不为其他成员使用构造函数初始值设定项列表呢?实际上几乎没有任何负面影响。+1它在VS2012中不起作用(如果你安装了CTP,但肯定不是VS2012本身),我忘记了非静态数据成员初始值设定项,这是一个比我的答案更好的选择。我还将
m_ia
m_ib
分配给0.+1它在VS2012中不起作用(可能如果您安装了CTP,但肯定不是VS2012本身)。我忘记了非静态数据成员初始值设定项,这是一个比我的答案更好的选择。我还将
m_ia
m_ib
赋值为0。我们为什么要在没有任何参数的情况下初始化其他两个构造函数中的计数请检查-“”并阅读有关类中常量数据成员的内容它会让您更清楚我们为什么要在没有任何参数的情况下初始化其他两个构造函数中的计数请检查-“”在课堂上阅读有关const数据成员的内容,它会让你更加清晰