static

数据成员

image.png
个人理解:static修饰的变量是存在缓存的,意味着这个变量至始至终不会消亡,而const 定义的常量在超出其作用域之后其空间会被释放。
例如:
1、不受private和protected访问限制

  1. xxx.h文件
  2. class base{
  3. private:
  4. static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
  5. };
  6. xxx.cpp文件
  7. const int base::_i=10;//定义(初始化)时.

2、即使是出了类作用域,也能在main方法中生存

  1. #include <iostream>
  2. static int a = 10;
  3. int main(){
  4. int b = a;
  5. cout << b;
  6. return 0;
  7. }//a的作用域为cpp整个文件

static 表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
static 静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate = 2.25;
static 关键字只能用于类定义体内部的声明中,在类外部定义初始化时不需要添加 static关键字修饰。

  1. //const 数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。
  2. class Test{
  3. public:
  4. Test():a(0){}
  5. enum {size1=100,size2=200};
  6. private:
  7. const int a;//只能在构造函数初始化列表中初始化
  8. static int b;//在类的实现文件中定义并初始化
  9. const static int c;//与 static const int c;相同。
  10. };
  11. int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。
  12. cosnt int Test::c=0;//注意:给静态成员变量赋值时,不需要加static修饰符,可以加cosnt。

static关键字也适用泛型编程

  1. template< class T>
  2. class Box{
  3. public:
  4. static int len;
  5. Box(T n):num(n) { cout << "调用构造函数!" << endl; }
  6. ~Box() {
  7. cout << "调用析构函数!" << endl;
  8. }
  9. T getNum() {
  10. return num;
  11. }
  12. int Box<int>::len = 1;

函数成员

image.png
一般用于记录类实例化的构造次数。

调用的两种方法:

1、通过对象名.函数名
2、类名::函数名

  1. #include <iostream>
  2. using namespace std;
  3. class Point {
  4. public:
  5. Point(int x = 0, int y = 0) : x(x), y(y) { count++; }//构造函数
  6. Point(Point &p) { //复制构造函数
  7. x = p.x;
  8. y = p.y;
  9. count++;
  10. }
  11. ~Point() { count--; }
  12. int getX() { return x; }
  13. int getY() { return y; }
  14. static void showCount() {
  15. cout << " Object count = " << count << endl;
  16. }
  17. private:
  18. int x, y;
  19. static int count; //静态数据成员声明,用于记录点的个数
  20. };
  21. int Point::count = 0;//静态数据成员定义和初始化,使用类名限定
  22. int main() {
  23. Point a(4, 5); //定义对象a,其构造函数回使count增1
  24. cout << "Point A: " << a.getX() << ", " << a.getY();
  25. Point::showCount(); //输出对象个数
  26. Point b(a); //定义对象b,其构造函数回使count增1
  27. cout << "Point B: " << b.getX() << ", " << b.getY();
  28. Point::showCount(); //输出对象个数
  29. return 0;
  30. }

参考:https://www.runoob.com/w3cnote/cpp-static-const.html