美文网首页
C++ 结构体和类中使用静态修饰

C++ 结构体和类中使用静态修饰

作者: 不决书 | 来源:发表于2023-03-01 16:42 被阅读0次

    // main.cpp

        struct Entry {
            int x;
            int y;
        };
    
      int main(){
        // 实例化第一个结构体e
        Entry e;
        e.x = 2;
        e.y = 3;
     
        // 实例化第二个结构体e1
        Entry e1 = { 5, 8};
        std:cout << e.x << " , "  << e.y << std:endl;
        std:cout << e1.x << " , "  << e1.y << std:endl;
      }
    

    最后的输出结果:
    2 , 3
    5, 8

    将结构体中的变量更改为静态

         struct Entry {
            static int x;
            static int y;
        };
    int main(){
      // 实例化第一个结构体e
       Entry e;
        e.x = 2;
        e.y = 3;
        
        // 实例化第二个结构体e1
        Entry e1 = { 5, 8};
    
        std:cout << e.x << " , "  << e.y << std:endl;
        std:cout << e1.x << " , "  << e1.y << std:endl;
     }
    

    再次运行,提示错误

    无法解析的外部符号 "public: static int Entry::x" (?x@Entry@@2HA)
    fatal error LNK1120: 2 个无法解析的外部命令

    修改代码

    增加一个静态的打印函数

     struct Entry {
            static int x;
            static int y;
           static void  print() {
            std::cout << x << ", " << y << std::endl;
        }
        };
    
    int main()
    {
        Entry e;
        e.x = 2;
        e.y = 3;
     
         Entry e1;
         e1.x = 5;
         e1.y = 8;
        // 调用结构体提供的打印函数
      e.print();
         e.print();
         std::cin.get();
    }
    
    

    结果还是会报以上的错误

    再次修改代码,对结构体中的静态变量定义为全局变量

       struct Entry {
            static int x;
            static int y;
           static void  print() {
            std::cout << x << ", " << y << std::endl;
        }
        };
    
    // 定义为全局变量
    int Entry::x;
    int Entry::y;
    
    int main()
    {
        Entry e;
        e.x = 2;
        e.y = 3;
        // 调用结构体提供的打印函数
       
    
         Entry e1;
         e1.x = 5;
         e1.y = 8;
        // 调用结构体提供的打印函数
        
         e.print();
         e1.print();
         std::cin.get();
    }
    ···
    执行程序输出
    5, 8
    5.    8
    根据输出的结果,e  与 e1 是两个不同的实例,但用于相同的变量,所以以上代码也可以更改为
    ```C++
     int main()
    {
        Entry e;
        Entry.x = 2;
        Entry.y = 3;
        // 调用结构体提供的打印函数
       
    
         Entry e1;
         Entry.x = 5;
         Entry.y = 8;
        // 调用结构体提供的打印函数
        
         e.print();
         e1.print();
         std::cin.get();
    }
    

    输出的结果上一次是一致的,这里静态的struct 在系统中只有一份,所以我们没必要定义实例e与e1,
    所有的静态方法和变量都可以直接引用,如下

       int main()
    {
        Entry.x = 2;
        Entry.y = 3;
        // 调用结构体提供的打印函数
       
    
         Entry.x = 5;
         Entry.y = 8;
        // 调用结构体提供的打印函数
        
         Entry::print();
         std::cin.get();
    }
    

    如果我们把struct 中的静态变量更改为普通变量,在静态方法中也是获取不到的

       struct Entry {
            int x;
            int y;
           static void  print() {
            std::cout << x << ", " << y << std::endl;
        }
        };
    
    // 定义为全局变量
    int Entry::x;
    int Entry::y;
    
    int main()
    {
        Entry e;
        e.x = 2;
        e.y = 3;
        // 调用结构体提供的打印函数
       
    
         Entry e1;
         e1.x = 5;
         e1.y = 8;
        // 调用结构体提供的打印函数
        
         e.print();
         e1.print();
         std::cin.get();
    }
    

    运行后提示错误

    对非静态成员“Entry::x”的非法引用

    相关文章

      网友评论

          本文标题:C++ 结构体和类中使用静态修饰

          本文链接:https://www.haomeiwen.com/subject/qgtrldtx.html