关于static修饰符

时间:2021-07-18 21:04:38
[C++]关于static修饰符 2010年07月01日 星期四 21:58

一、类的 static数据成员

1. 类的 static数据成员必须在类外部进行初始化

          

           class Test
{
public:

... ...

private:

static int ival;

};

intTest::ival=0; //必须初始化,否则编译出错!

2. static数据成员的类型可以是该成员所属的类类型。而非static数据成员被限定声明为其自身类对象的指针或引用。

            

           class Test
{
public:

... ...

private:

static Teststobj; //正确。static数据成员stobj的类型可以为Test类型
Test*ptobj; //正确。非static数据成员ptobj的类型为Test*指针
Test&robj; //正确。非static数据成员robj的类型为Test&引用
Testtobj; //错误。非static数据成员tobj的类型不能为Test类型

};

3. static数据成员可以用作默认实参。而非static数据成员不能用作默认实参,因为它的值不能独立于所属对象而使用。

         

          class Test
{
public:

... ...
void SetId ( int id = total );
... ...

private:

static int total;

};

二、类的 static成员函数

1. 静态成员函数不允许使用修饰符(如const)。因为static成员不是任何对象的组成部分,将成员函数声明为const就是承诺不会修改该函数所属的对象。

        

          class Test
{
public:

Test() { ++m_total; }
static int GetTotalNum() const { return m_total;} //编译出错:“error C2272: “GetTotalNum”: 静态成员函数上不允许修饰符”
~Test() { --m_total; }
... ...

private:

static int m_total;

};

int Test::m_total=0;

2. 类的 static成员函数不能被声明为虚函数

           class Test
{
public:

... ...
virtual static intBeginNo(); //错误!

private:

... ...

};

3. 类的 static 成员函数不允许访问非 static成员(数据成员或成员函数)

          class Test
{
public:

... ...
int GetCurNum() { return m_num; }
static int GetTotalNum();
... ...

private:

int m_num;
static int m_total;

};

int Test::m_total=0;

int Test::GetTotalNum()
{

GetCurNum(); //错误!GetCurNum()是非static成员函数
++m_num; //错误!m_num是非static数据成员

}

摘自:http://blog.csdn.net/fw_np/article/details/6264916