关于static修饰符

本文详细介绍了C++中static修饰符的应用,包括static数据成员的外部初始化、类型使用及作为默认实参的方法;同时讲解了static成员函数的特点,如不能使用const修饰符、不能声明为虚函数以及不能访问非static成员等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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.youkuaiyun.com/fw_np/article/details/6264916

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值