1. const成员变量
1. const成员变量需要在实例化类对象时由构造函数进行初始化。
推荐做法是在构造函数中的初始化列表进行初始化,这一点是和引用类型的成员是一致的。
2. 因为是const类型,一旦类对象构造完成,const成员即不可修改。
3. 因为是成员变量,所有类外不具有访问权限。
class Student
{
public:
Student(const std::string& name, int age)
: m_name(name), m_age(age)
{
}
~Student(){}
private:
const std::string m_name;
int m_age;
};
这是推荐的构造函数书写方式。
2.static成员变量
1. static成员变量虽叫成员变量,但它非类对象所有,而属于类所有。该类所有对象对它都具有访问权限
(前提条件:必须将其声明为public,当然,既然是共有,也应该将其声明为public)。
2. 它在类对象生成前就已经构造完成。可以对其进行修改。
3. static成员变量的初始化(或者叫赋值)需要放在类外进行。
4. 如果类声明放在.h文件中,那么static成员变量的初始化需要放在.cpp中。
class Student
{
public:
Student(const std::string& name, int age)
: m_name(name), m_age(age)
{
++m_stuCnt;
}
~Student(){}
public:
static int m_stuCnt; // 声明
private:
const std::string m_name;
int m_age;
};
// 初始化
int Student::m_stuCnt = 0; // 无需加static关键字
对于static成员变量的访问方式有以下二种:
类名::static变量名(强烈推荐)
对象名.static变量名
3.static const(const static)成员函数
1. static const和const static顺序不一样,效果一样。
2. static const成员变量属于类所有,所有类成员都其都具有访问权限。同static成员变量
3. static const成员变量一旦赋值后,其值不可修改。
4. static const int类型成员变量可以在类中进行赋值,也可在类外赋值。
(对于static const推荐在类型进行赋值)
补充:除了static const int类型成员变量可以在类中直接赋值,
double、float、long等静态常量成员都可以在类中进行赋值。
详细内容可以参考
STL源码剖析 1.9.3节 ”静态常量整数成员在class内部直接初始化“
class Student
{
public:
Student(const std::string& name, int age)
: m_name(name), m_age(age)
{
++m_stuCnt;
}
~Student(){}
public:
static int m_stuCnt; // 声明
static const int m_maxStuCnt = 50; // 方法1
private:
const std::string m_name;
int m_age;
};
// 初始化
int Student::m_stuCnt = 0; // 无需加static关键字
<pre name="code" class="cpp">class Student
{
public:
Student(const std::string& name, int age)
: m_name(name), m_age(age)
{
++m_stuCnt;
}
~Student(){}
public:
static int m_stuCnt; // 声明
static const int m_maxStuCnt; // 方法2
private:
const std::string m_name;
int m_age;
};
// 初始化
int Student::m_stuCnt = 0; // 无需加static关键字
int const Student::m_maxStuCnt = 50; // 方法2 必须加const关键字(const在int前也行)