C++类成员:const 和 static用法
1.常量成员 const
类的常量成员,具备以下特性:
1.1.const成员必须被初始化
1.2.const成员只能在初始化列表中赋值
1.3.const成员不能在构造函数原型中赋值
1.4.const成员初始化之后无法更改
class ConstMember { public: ConstMember(int num = 0) :m_num(num) //ok,对应1、2,否则无法通过编译 { //m_num = num; //error,对应3,只能在初始化列表内赋值 } ~ConstMember() {} ; void set(int num = 0) { //m_num = num; //error,对应4,const变量无法被更改 } const int getNum() { return m_num; } private: const int m_num; }; int main(){ ConstMember c1; cout << "c1 = " << c1.getNum() << endl; // 输出0 ConstMember c2(2); cout << "c2 = " << c2.getNum() << endl; // 输出2 c1.set(3); //无法被更改,否则会报错 cout << "c1 = " << c1.getNum() << endl; // 输出0 return 0; }
2.静态成员 static
类的静态成员,具备以下特性:
2.1.static成员必须被初始化,只能在类的外面进行初始化,且不能带static关键字
2.2.static成员不能在初始化列表中初始化
2.3.static成员可以在构造函数原型中被更改
2.4.static成员可以被外部更改
2.5.static成员被所有的此类共享,在某个类中改变其数值,会影响其它同类当中的该成员数值
3.静态常量成员 static const
类的静态常量成员,具备以下特性:
1.static const成员必须被初始化,只能在类的外面进行初始化,且不能带static关键字,必须带const关键字
2.static const成员不能在初始化列表中初始化
3.static const成员不可以在构造函数原型中被更改
4.static const成员不可以被外部更改
5.static const成员被所有的此类共享
class StaticConstMember { public: StaticConstMember(int num = 0) //:m_num(num) //error,对应2,不能在初始化列表赋值 { //m_num = num; //error,对应3,不能在构造函数内 } ~StaticConstMember() {} ; void set(int num = 0) { //m_num = num; //error,对应4,不能更改值 } const int getNum() { return m_num; } private: static const int m_num; }; const int StaticConstMember::m_num = 0; //对应1,在外部初始化 int main(){ StaticConstMember sc1; cout << "sc1 = " << sc1.getNum() << endl; // 输出0 StaticConstMember sc2(2); cout << "sc2 = " << sc2.getNum() << endl; // 输出0,共享静态变量,且无法修改,因此不改变值 sc1.set(3); cout << "sc1 = " << sc1.getNum() << endl; // 输出0,共享静态变量,且无法修改,因此不改变值 cout << "sc2 = " << sc2.getNum() << endl; // 输出0,共享静态变量,且无法修改,因此不改变值 return 0; }
4.静态成员函数
静态成员函数包含以下特性:
1.静态成员函数可以不构造类,直接调用
调用方式为 类名::函数名。
2.静态成员函数不能包含内部任何形式的非静态成员
3.静态成员函数可以接受外部参数
4.静态成员函数可以包含内部静态成员
class StaticFunction { public: static void Helloworld() { cout << "Hello world" << endl; } static void SetValue(int a) { //参考4,可以接受外部参数 //m_s = m_i; //error,参考2,不能包含任何非静态成员 //m_s = m_c; //error,参考2,不能包含任何非静态成员 m_s = 4; //参考3,可以包含非静态成员 m_s = a; } private: int m_i; const int m_c; static int m_s; }; int StaticFunction::m_s = 1; int main(){ StaticFunction::Helloworld(); //参考1,无需构造类,直接调用 StaticFunction::SetValue(2); return 0; }