再说c++ static

类外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);


类的静态成员函数


  类的C++静态成员函数只能访问类的静态数据成员,而不能访问类中的普通函数成员(非静态数据成员),因为普通数据成员只有类的对象存在时才有意义。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章