类外static
1)修饰全局变量——限制访问范围为文件内部可见
2)修饰函数——
限制访问范围为文件内部可见
3)修饰函数内部局部变量——在函数中,只初始化一次(即使多次调用),并具有记忆功能
4)static不可修饰函数参数
类内static
类的静态变量
1) c++ 类的static成员变量必须在类外进行初始化。否则不可用(详见2)。
2) 但是当有一个类的静态成员变量未初始化,如果之后的代码中没有使用到该变量,编译运行是不会报错的,但是如果有用到这个变量,编译会报错。
3) 类的静态变量不能在类的内部进行初始化,需要在类外进行初始化。(这一点和类的普通静态常量不一样)
4) 类的静态对象成员,会在main函数之前进行构造(会调用构造函数),属于类,不属于某个对象。
从这点可以看出,如果将某个功能函数F的实现部分放在一个类A的构造函数中调用,在另一个类B中声明一个类A的静态对象。就算是一个空的main函数,也一样可以使功能函数F被调用到。
类的静态常量
普通的类静态常量
1) 静态常量可以在类的内部进行初始化, 也可以在类的外部进行初始化。
class Test
{
public:
Test(){}
static const int m_s_int;
static const int m_s_int2 = 200;
};
const int Test::m_s_int = 100;
int main()
{
Test test;
cout << test.m_s_int << endl;
cout << test.m_s_int2 << endl;
return 0;
}
自定义类静态常量
1) 自定义类静态常量不能在类内部进行初始化。
// Apple是一个自定义的类型
class Apple
{
};
class Test
{
public:
Test(){}
static const Apple m_s_apple = Apple(); // error: a call to a constructor cannot appear in a constant-expression
static const Apple* m_s_p_apple = new Apple(); // error: `new' cannot appear in a constant-expression
};
error: `new' cannot appear in a constant-expression
error: a call to a constructor cannot appear in a constant-expression
只能像如下这样,老老实实在类外进行初始化。
class Test
{
public:
Test(){}
static const Apple m_s_apple;
static const Apple* m_s_p_apple;
};
const Apple Test::m_s_apple = Apple();
const Apple* Test::m_s_p_apple = new Apple(RED, 100);