标签:
一、静态数据成员
类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:
1.静态数据成员的初始化
静态数据成员实际上是类域成员,在类内定义,类外初始化。类被可以定义常量静态变量,不能定义非常量静态变量。
1 #include <iostream> 2 class S{ 3 public: 4 static int static_i;//declare 5 static const int const_static_i = 10; 6 private: 7 8 }; 9 int S::static_i = 10; //definition 10 11 int main() 12 { 13 S s; 14 std::cout << ++S::static_i << std::endl; 15 std::cout << ++s.static_i << std::endl; 16 return 0; 17 }
2. .静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。
1 #include <iostream> 2 class base{ 3 public : 4 static int _num;//declare 5 }; 6 int base::_num=0;//definition 7 8 class derived:public base{ 9 }; 10 11 int main() 12 { 13 base a; 14 derived b; 15 std::cout << ++a._num << std::endl; 16 std::cout << ++b._num << std::endl; 17 return 0; 18 }
3.静态成员可以成为成员函数的可选参数,而普通成员不可以。
1 class base 2 { 3 public: 4 void func2(void(*)()){} 5 void func3() 6 { 7 func2(f1); 8 func2(f2); 9 //func2(f3); //错误 10 } 11 private: 12 static void (*f1)(); 13 static void f2(){} 14 void f3(){} 15 };
4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为所属类类型的指针或引用
1 class base 2 { 3 public: 4 static base b1; 5 //base b2; //error 6 base* b3; 7 base& b4 = b1; 8 };
二、静态成员函数
1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存
1 class base{ 2 static int func1(); 3 int func2(); 4 }; 5 6 int (*pf1)()=&base::func1;//普通的函数指针 7 int (base::*pf2)()=&base::func2;//成员函数指针
2..静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下
1 class base{ 2 virtual static void func1();//错误 3 static void func2() const;//错误 4 static void func3() volatile;//错误 5 };
标签:
原文地址:http://www.cnblogs.com/wxquare/p/4927720.html