C++初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员、static成员、const static成员的初始化:

1、const成员:只能在构造函数后的初始化列表中初始化(C++98);

   (C++11提供了类内初始化,因此内类常量可在声明类时进行类内初始化,因此该类内常量的作用域属于类级,即该类的所有对象均具有同一个值。)

#include 
using namespace std;
class A {
public:
	A(int j) :m_j(j) {}
private:
	const int m_i = 6;
	const int m_j;
};
int main()
{
	system("pause");
	return 0;
}

const作为类成员为什么只能在初始化列表中被初始化呢?

构造函数创建对象时,对象在执行构造函数函数体前(即大括号之前)被创建(即分配存储空间)。因此,调用构造函数将为对象的成员变量分配内存。然后程序流程进入到构造函数函数体(大括号中的代码),使用常规的赋值方式对成员变量进行赋值。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象(即为const变量分配内存时),进行初始化。因此,const成员不能通过普通的构造函数来初始化。

2、static成员:初始化在类外,且不能加static修饰

#include 
using namespace std;
class A {
private:
	//static int m_i = 5;错误
	static int m_i;
};
int A::m_i = 5;
int main()
{
	system("pause");
	return 0;
}

3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化,也可以像static在类外初始化

#include 
using namespace std;
class A {
private:
	static const int m_i;
	int k[m_i];//错误,编译期间无法获得m_i的值
};
const int A::m_i =6 ;
int main()
{
	system("pause");
	return 0;
}

#include 
using namespace std;
class A {
private:
	static const int m_i = 5;
	int k[m_i];
};
const int A::m_i;
int main()
{
	system("pause");
	return 0;
}

如果要取static const 成员变量地址,则必须对其变量进”类外定义“(该定义不指定值,容易误解为声明),因为编译器要求,如果要对内类const进行取地址,必须提供定义式。而且注意:VS2015等编译期对此做了优化,可以不按上述说法,但是在g++中,需按上述说法严格执行

#include 
class A {
        public:
                static const int m_i=5;
};
//const int A::m_i;

int main()
{
        A a;
        std::cout << &(a.m_i) << std::endl;
        return 0;
}

#include 
class A {
        public:
                static const int m_i=5;
};
const int A::m_i;

int main()
{
        A a;
        std::cout << &(a.m_i) << std::endl;
        return 0;
}

C++初始化类的常量数据成员、静态数据成员、常量静态数据成员_第1张图片

4.C++中普通成员变量可以在类内初始化吗?

在g++中是不支持的,会提出警告,实验如下:
#include 
class A {
        public:
                int i=6;
};
int main()
{
        return 0;
}

但是在C++11标准允许在类定义时初始化数据成员,所以VS2015不会提出警告

#include 
using namespace std;
class A {
private:
	const int m_i;
};

int main()
{
	system("pause");
	return 0;
}

你可能感兴趣的:(Effective,C++)