C++ 类中static浅解
1.C++类成员变量为static
如果c++类的成员变量为staic,该静态成员变量已经进行了声明,该静态变量的定义最好在*.cpp进行定义,在头文件(*.h)中定义不是不行,如果包含该头文件的就只有一个文件的话,那是没有问题,例如,在A.h声明了一个static变量,然后同样在这个文件中对这个静态变量进行了定义,然后再任何的实现文件(*.cpp)中只有一个文件写成#include”A.h”,那是没有问题,像在A.h中的一个类中声明了的一个静态成员变量,然后再类外定义了该变量,然后实现文件为main.cpp,那样的话,就不会重复定义的问题。
如果静态变量的声明和定义都是在一个文件中如果包含这个头文件,出现两次,那么编译器会报重复定义的错误。
具体的定义的方法是, 变量类型(前面不用加static)类名::变量名=类型值;
2.c++类成员函数声明成static
书上说,静态成员函数,不能访问非静态成员变量,不能调用非静态成员函数,这是为什么呢?主要的原因是理解编译器对c++中静态成员变量和静态成员函数,和非静态的是区分对待的。你可以这样理解,对于静态的变量和函数,vs在编译阶段就对静态的成员变量进行了内存分配,是时时在在存在的,而对于不是静态的话,只有在类的对象创建的时候才进行内存分配。这样就形成很大的区别,简单的说,在编译阶段类中,实际有的东西,只有静态变量,静态函数,其他的都可以认为是不存在的。这样理解的话,就能理解,为什么静态成员函数,不能访问非静态成员变量,因为在编译的时候,这些非静态成员变量是没有的。
另外为什么静态成员函数,不能访问非静态成员函数,原因有两点,一是上面提到的,有可能出现访问非静态成员变量的可能,另外一种是,c++的隐含的this指针,静态成员函数是没有这个默认参数的,只有非静态的成员函数才有。所以当静态成员函数调用非静态成员函数时,当非静态成员函数,需要参数this指针的时候,静态成员函数,没法提供。所以静态成员函数,不能访问非静态成员函数。