大家讨论一下类成员初始化问题。
关于类成员初始化的问题:
使用vc7.0
以下是个小结,不知是否有错误或纰漏,请指正:
#include "stdafx.h"
#include <iostream>
using namespace std;
//一个普通类
class C1
{
public:
int m_var;//变量成员
const int m_const;//常量成员
static int m_static_var;//静态变量成员
static const int m_static_const=44;//静态常量成员;可以这样初始化,并且可以不用在类外定义一个空间;似乎不符合c++标准
C1():m_const(56)//常量成员必须在这初始化
{
cout<<"构造C1"<<endl;
m_var=34;//变量成员可在这初始化,也可在常量成员初始化的位置初始化
};
};
int C1::m_static_var = 22;//静态变量成员必须这样初始化
//const int C1::m_static_const=55;//静态常量成员可以这样初始化,但在类内不要再初始化了
int _tmain(int argc, _TCHAR* argv[])
{
C1 a;
cout<<"a.m_var="<<a.m_var<<endl;
cout<<"a.m_const="<<a.m_const<<endl;
cout<<"a.m_static_var="<<a.m_static_var<<endl;
cout<<"a.m_static_const="<<a.m_static_const<<endl;
return 0;
}
下一个例子和上一个差不错,只不过加了模版。
#include "stdafx.h"
#include <iostream>
using namespace std;
//一个模版类
template<int T>
class C1
{
public:
int m_var;//变量成员
const int m_const;//常量成员
static int m_static_var;//静态变量成员
static const int m_static_const=44;//静态常量成员;可以这样初始化,并且可以不用在类外定义一个空间;似乎不符合c++标准
C1():m_const(56)//常量成员必须在这初始化
{
cout<<"构造C1"<<endl;
m_var=34;//变量成员可在这初始化,也可在常量成员初始化的位置初始化
};
};
//int C1<T>::m_static_var = 22;//error!!!!!静态变量成员如何初始化?
int _tmain(int argc, _TCHAR* argv[])
{
C1<1> a;
cout<<"a.m_var="<<a.m_var<<endl;
cout<<"a.m_const="<<a.m_const<<endl;
//cout<<"a.m_static_var="<<a.m_static_var<<endl;
cout<<"a.m_static_const="<<a.m_static_const<<endl;
return 0;
}
这里有个问题了:模版类的静态变量成员如何初始化?
总不能这样吧:
#include "stdafx.h"
#include <iostream>
using namespace std;
//一个模版类
template<int T>
class C1
{
public:
int m_var;//变量成员
const int m_const;//常量成员
static int m_static_var;//静态变量成员
static const int m_static_const=44;//静态常量成员;可以这样初始化,并且可以不用在类外定义一个空间;似乎不符合c++标准
C1():m_const(56)//常量成员必须在这初始化
{
cout<<"构造C1"<<endl;
m_var=34;//变量成员可在这初始化,也可在常量成员初始化的位置初始化
};
};
//这么初始化静态变量成员
int C1<1>::m_static_var=22;
int C1<2>::m_static_var=22;
int _tmain(int argc, _TCHAR* argv[])
{
C1<1> a;
cout<<"a.m_var="<<a.m_var<<endl;
cout<<"a.m_const="<<a.m_const<<endl;
cout<<"a.m_static_var="<<a.m_static_var<<endl;
cout<<"a.m_static_const="<<a.m_static_const<<endl;
return 0;
}