关于static修饰符

[C++]关于static修饰符
2010年07月01日 星期四 21:58

一、类的 static 数据成员

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

            class Test
            {
              public:

                      ... ...

             private:

                     static int ival;

             };

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

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

             class Test
            {
            public:

                       ... ...

            private:

                      static Test stobj;               //正确。static数据成员stobj的类型可以为Test类型
                      Test *ptobj;                      //正确。非static数据成员ptobj的类型为Test*指针
                       Test &robj;                        //正确。非static数据成员robj的类型为Test&引用
                       Test tobj;                         //错误。非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 int BeginNo();                   //错误!

            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数据成员

            }

### C# 中 `static` 修饰符的作用和用法 #### 1. **静态成员** 当使用 `static` 修饰符时,表示该成员(方法、字段、属性等)属于类本身而非某个特定的实例。这意味着可以通过类名直接访问这些成员,而无需创建类的实例。 例如,在给定的例子中,`myStaticMethod` 是一个静态方法,可以直接通过类名调用来执行[^1]: ```csharp MainClass.myStaticMethod(); ``` 与此相对的是非静态成员(如 `myPublicMethod`),它们需要先创建类的实例才能被调用[^1]: ```csharp MainClass myObj = new MainClass(); myObj.myPublicMethod(); ``` --- #### 2. **静态类** `static` 也可以用于整个类的声明。静态类具有以下特点: - 它们只能包含静态成员。 - 不允许实例化,即无法使用 `new` 关键字创建其对象。 - 常用于提供工具函数其他不需要状态管理的功能。 示例代码如下所示[^2]: ```csharp public static class MyStaticClass { public static void MyStaticMethod() { Console.WriteLine("这是一个静态类中的静态方法"); } } ``` 在这个例子中,`MyStaticClass` 只能通过类名调用其中的方法,而不能像普通类那样创建实例: ```csharp MyStaticClass.MyStaticMethod(); // 正确 // MyStaticClass obj = new MyStaticClass(); // 错误,因为这是静态类 ``` --- #### 3. **与其他接口的关系** 在某些情况下,`static` 和其他概念(如泛型接口 `IEnumerable<T>`)可能会一起使用。虽然 `static` 自身并不直接影响集合操作,但它可以帮助我们设计更高效的 API 工具类[^3]。 例如,如果有一个实现 `IEnumerable<T>` 的集合类型,则可以编写一个静态帮助器类来处理此类数据结构的操作[^3]: ```csharp public static class CollectionHelper { public static void PrintElements<T>(this IEnumerable<T> collection) { foreach (var item in collection) { Console.WriteLine(item); } } } List<int> numbers = new List<int>() { 1, 2, 3 }; numbers.PrintElements(); // 使用扩展方法打印列表内容 ``` 在这里,`CollectionHelper` 提供了一种通用的方式来增强任何实现了 `IEnumerable<T>` 的类型的可用性。 --- #### 总结 `static` 修饰符的主要用途在于定义那些独立于具体实例的行为逻辑。无论是单个成员还是整个类都可以标记为静态,这使得程序更加简洁高效并减少了不必要的内存开销。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值