zoukankan      html  css  js  c++  java
  • C++基本之--静态成员函数和静态成员变量

    #include <iostream>  
    using namespace std;  
      
    class Internet  
    {  
    public:  
        Internet(char *name,char *address)  
        {  
            strcpy(Internet::name,name);  
            strcpy(Internet::address,address);  
            count++;  
        }  
        static void Internet::Sc()//静态成员函数  
        {  
            cout<<count<<endl;  
        }  
        Internet &Rq();  
    public:  
        char name[20];  
        char address[20];  
        static int count;//这里如果写成static int count=0;就是错误的 ( 编译器规定的!)
    };  
      
    Internet& Internet::Rq()//返回引用的成员函数  
    {  
        return *this;  
    }  
      
    int Internet::count = 0;//静态成员的初始化  
    void vist()  
    {  
        Internet a1("中国软件开发实验室","www.cndev-lab.com");  
        Internet a2("中国软件开发实验室","www.cndev-lab.com");  
    }  
    void fn(Internet &s)  
    {  
        cout<<s.Rq().count;  
    }  
    int main()  
    {  
        cout<<Internet::count<<endl;//静态成员值的输出  
        vist();  
        Internet::Sc();//静态成员函数的调用  
        Internet b("中国软件开发实验室","www.cndev-lab.com");  
        Internet::Sc();  
        fn(b);  
        cin.get();  
    }

     上面代码我们用了几种常用的方式建立对象,当建立新对象并调用其构造函数的时候,静态成员cout便运行加1操作,静态成员的初始化应该在主函数调用之前,并且不能在类的声明中出现,通过运行过程的观察我们发现,静态成员count的状态并不会随着一个新的对象的新建而重新定义,尽而我们了解到类的静态成员是属于类的而不是属于哪一个对象的,所以静态成员的使用应该是类名称加域区分符加成员名称的,在上面的代码中就是Internet::count,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态态类成员的特性就是属于类而不专属于某一个对象。

      静态成员函数的特性类似于静态成员的使用,同样与对象无关,调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();,静态成员函数由于与对象无关系,所以在其中是不能对类的普通成员进行直接操作的。

      如果上面的 static void Internet::Sc()修改成为:

    static void Internet::Sc()//静态成员函数  
    {  
        cout<<name<<endl;//错误  
        cout<<count<<endl;  
    } 

    静态成员函数与普通成员函数的差别就在于缺少this指针,没有这个this指针自然也就无从知道name是哪一个对象的成员了。

      根据类静态成员的特性我们可以简单归纳出几点,静态成员的使用范围:

      1.用来保存对象的个数。

      2.作为一个标记,标记一些动作是否发生,比如:文件的打开状态,打印机的使用状态,等等。

      3.存储链表的第一个或者最后一个成员的内存地址。 

  • 相关阅读:
    spring AOP (使用AspectJ的注解方式 的aop实现) (6)
    spring aop的前奏,动态代理 (5)
    Python基础笔记系列九:变量、自定义函数以及局部变量和全局变量
    Python基础笔记系列八:字符串的运算和相关函数
    Python基础笔记系列六:字典
    Python基础笔记系列五:元组
    Python基础笔记系列四:工具的安装与配置
    Python基础笔记系列三:list列表
    Python基础笔记系列二:分支和循环
    Python基础笔记系列一:基本工具与表达式
  • 原文地址:https://www.cnblogs.com/qbmiller/p/3810797.html
Copyright © 2011-2022 走看看