C++类静态数据成员与类静态成员函数

2016-02-19 19:59 8 1 收藏

今天图老师小编给大家精心推荐个C++类静态数据成员与类静态成员函数教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

在没有讲述本章内容之前假如我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢?
  
  这个问题便是本章的重点:
  
   !-- frame contents -- !-- /frame contents --   声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。
  
    下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违反类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更轻易理解,我们在此处都设置为public。
  
  以下程序我们来做一个模拟访问的例子,在程序中,每建立一个对象我们设置的类静态成员变自动加一,代码如下:#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()//静态成员函数 
      { 
          coutcountendl; 
      } 
      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) 
  { 
      couts.Rq().count; 
  } 
  void main() 
  { 
      coutInternet::countendl;//静态成员值的输出 
      vist(); 
      Internet::Sc();//静态成员函数的调用 
      Internet b("中国软件开发实验室","www.cndev-lab.com"); 
      Internet::Sc(); 
      fn(b); 
      cin.get(); 
  }  上面代码我们用了几种常用的方式建立对象,当建立新对象并调用其构造函数的时候,静态成员cout便运行加1操作,静态成员的初始化应该在主函数调用之前,并且不能在类的声明中出现,通过运行过程的观察我们发现,静态成员count的状态并不会随着一个新的对象的新建而重新定义,尽而我们了解到类的静态成员是属于类的而不是属于哪一个对象的,所以静态成员的使用应该是类名称加域区分符加成员名称的,在上面的代码中就是Internet::count,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态态类成员的特性就是属于类而不专属于某一个对象。
  
   更多内容请看C/C++技术专题专题,或
  静态成员函数的特性类似于静态成员的使用,同样与对象无关,调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();,静态成员函数由于与对象无关系, !-- frame contents -- !-- /frame contents -- 所以在其中是不能对类的普通成员进行直接操作的。
  
  假如上面的 static void Internet::Sc()修改成为:static void Internet::Sc()//静态成员函数 
  { 
      coutnameendl;//错误 
      coutcountendl; 
  }   静态成员函数与普通成员函数的差别就在于缺少this指针,没有这个this指针自然也就无从知道name是哪一个对象的成员了。  根据类静态成员的特性我们可以简单归纳出几点,静态成员的使用范围:
  
  1.用来保存对象的个数。
  
  2.作为一个标记,标记一些动作是否发生,比如:文件的打开状态,打印机的使用状态,等等。
  
  3.存储链表的第一个或者最后一个成员的内存地址。
  
  为了做一些必要的练习,深入的把握静态对象的存在的意义,我们以前面的结构体的教程为基础,用类的方式描述一个线性链表,用于存储若干学生的姓名,代码如下:#include iostream 
  using namespace std; 
   
  class Student 
  { 
  public: 
      Student (char *name); 
      ~Student(); 
  public: 
      char name[30]; 
      Student *next; 
      static Student *point; 
  }; 
   
  Student::Student (char *name) 
  { 
      strcpy(Student::name,name); 
      this-next=point; 
      point=this; 
  } 
   
  Student::~Student ()//析构过程就是节点的脱离过程 
  { 
      cout"析构:"nameendl; 
   
      if(point==this) 
      { 
          point=this-next; 
          cin.get(); 
          return; 
      } 
      for(Student *ps=point;ps;ps=ps-next) 
      { 
          if(ps-next==this) 
          { 
          coutps-next""this-nextendl; 
          ps-next=next;//=next也可以写成this-next; 
  
           cin.get(); 
          return; 
          } 
      } 
      cin.get(); 
  } 
   
  Student* Student::point=NULL; 
  void main() 
  { 
      Student *c = new Student("marry"); 
      Student a("colin"); 
      Student b("jamesji"); 
      delete c; 
      Student *fp=Student::point; 
      while(fp!=NULL) 
      { 
          coutfp-nameendl; 
          fp=fp-next; 
      } 
      cin.get(); 
  }  从上面的代码来看,原来单纯结构化编程需要的一个链表进入全局指针在这里被类的静态成员指针所替代(类的静态成员完全可以替代全局变量),这个例子的理解重点主要是要注重观察类成员的析构顺序,通过对析构顺序的理解,使用析构函数来进行节点的脱链操作。  更多内容请看C/C++技术专题专题,或

来源:http://www.tulaoshi.com/n/20160219/1622479.html

延伸阅读
1. 传指针时,我们可以通过指针来修改它在外部所指向的内容。但假如要修改外部指针所指向的对象是不可能的。例如传递外部指针到函数内来分配空间,必须传递指针的指针或指针的引用。 2. char carry[10] = {0}; 编译器会将其后所有的东西都置0; !-- frame contents -- !-- /frame contents -- 3. 函数返回值为const时,返回...
标签: PHP
/* ------------------------------------------------------------------------------- | = 本文为Haohappy读<<Core PHP Programming | = 中Classes and Objects一章的笔记 | = 翻译为主 个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! | = PHP5研究中心:...
我谈到让一个类支持隐式类型转换通常是一个不好的主意。当然,这条规则有一些例外,最普通的一种就是在创建数值类型时。例如,假如你设计一个用来表现有理数的类,答应从整数到有理数的隐式转换看上去并非不合理。 !-- frame contents -- !-- /frame contents -- 这的确不比 C++ 的内建类型从 int 到 double 的转换更不合理(...
我谈到让一个类支持隐式类型转换通常是一个不好的主意。当然,这条规则有一些例外,最普通的一种就是在创建数值类型时。例如,假如你设计一个用来表现有理数的类,答应从整数到有理数的隐式转换看上去并非不合理。这的确不比 C++ 的内建类型从 int 到 double 的转换更不合理(而且比 C++ 的内建类型从 double 到 int 的转换合理得多)。在...
使非MFC窗口程序的窗口回调过程成为C++类的成员函数 作者:luzhl 下载源代码     一直以来,编写非MFC下的窗口程序,都习惯把窗口过程及消息处理函数编写成全局函数。为了把窗口回调过程及窗口消息处理函数封装成C++窗口类的成员函数,于是我编写了抽象类CWndProc: ...

经验教程

412

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部