静态数据成员
静态成员只属于类,不属于对象。该类的所有对象都共享同一个静态成员。静态成员的申明是使用static
关键字。正因为静态成员数据不属于任何一个对象,因此其初始化不应该有构造对象来进行初始化。其初始化方式有两种:
- 在类的内部申明静态数据成员,在类外部定义、初始化静态数据成员(不需要使用
static
)。这是常用的使用方式。静态数据成员应在*.cc
文件中进行定义和初始化。如果在头文件中定义以及初始化则当头文件被多个模块包含的时候会造成重复定义的错误。class Account{ public: // 申明静态数据成员 static double route; /*...*/ } // 定义并且初始化静态数据成员 double Account::route = 0.0;
- 当静态数据成员是[constexpr]时,可以在类内部申明、初始化静态数据成员,但是,仍然需要在类外进行定义(可以不初始化)。
class B{ public: // 申明并初始化 // 使用字面值初始化的 const 对象 --- 常量表达式 static const int num_const_ = 1; // 使用字面值初始化的常量表达式 static constexpr int num_constexpr_ = 2; // 使用常量表达式初始化的常量表达式 static constexpr int num_constexpr_1_ = num_constexpr_; }; // 定义 const int B::num_const_; constexpr int B::num_constexpr_; constexpr int B::num_constexpr_1_;
静态数据成员的引用可以使用类名::静态数据成员名
,也可以通过对象使用.
或者->
来引用(前提是静态成员为共有)。
#include <iostream>
#include <string>
using namespace std;
class B{
public:
static string GetStrPrivate(){ return str_pri_;}
public:
static string str_pub_;
private:
static string str_pri_;
};
string B::str_pub_("str_pub_ is public static string");
string B::str_pri_("str_pri_ is private static string");
int main(){
cout << B::str_pub_ << endl; // 在没有实例对象之前,可以使用作用域的访问方式。说明静态成员不隶属于对象,而属于类。
cout << B::str_pri_ << endl; // 私有静态成员不能直接访问,可以通过接口函数访问
cout << B::GetStrPrivate() << endl; // 静态成员函数也不隶属与的对象
B b;
// 在申明对象之后才可以使用访问操作符访问静态成员
cout << b.str_pub_ << endl;
cout << b.GetStrPrivate() << endl; // 私有静态成员可以使用相应的静态成员函数访问
return 0;
}
常量数据成员
常量数据成员在类的每个对象中都有一个值相同的常量数据成员。其初始化在C++98中需要在构造函数的初始化成员列表中进行初始化,但是在C++11中可以使用类内初始化,即在数据部分申明时直接对其进行初始化。如果数据成员是静态常量成员,需要兼顾两者的特点
#include <iostream>
using namespace std;
class B{
public:
// 类内申明并初始化常量数据成员
const float num_float = 0.3;
// 对于静态常量成员有两种初始化方式
static const int num_inside_ = 1; // 静态成员为常量表达式,可以类内初始化
static const int num_outside_;
};
const int B::num_outside_ = 2;
int main(){
cout << "initialize num inside of class: " << B::num_inside_ << endl;
cout << "initialize num outside of class: " <<B::num_outside_ << endl;
return 0;
}
[constexpr]: