网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C++中用于计算四则混合运算表达式.
.C语言库函数(S类字母).
.谁动了我的指针.
.学习C++的最大难度是什么?.
.C语言嵌入式系统编程修炼之键盘操.
.在 C++ 程序中导出 Word 文档的方.
.迷宫探路II.
.WINDOWS窗口的客户区域拖动技术及.
.图书管理程序.
.C++ 中的Singleton 类的实现讨论.
.几个游戏代码(麻将原代码).
.vb.net中windows服务的创建.
.C++多继承.
.C++箴言:拒绝不想用的编译器产生.
.ListBox自画的另一种效果.
.利用链表实现目录内所有文件列表.
.开发自己的英文语音朗读软件.
.GNUC库----调试系统问题并进行修.
.在Window右下角的添加图标.
.计算机应用基础操作题.

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

发表日期:2008-3-8


  在没有讲述本章内容之前假如我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢?

  这个问题便是本章的重点:

  声明为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()//静态成员函数 
    { 
        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; 

void 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,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态态类成员的特性就是属于类而不专属于某一个对象。

更多文章 更多内容请看C/C++技术专题专题,或
  静态成员函数的特性类似于静态成员的使用,同样与对象无关,调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();,静态成员函数由于与对象无关系,
所以在其中是不能对类的普通成员进行直接操作的。

  假如上面的 static void Internet::Sc()修改成为:static void Internet::Sc()//静态成员函数 

    cout<<name<<endl;//错误 
    cout<<count<<endl; 
}   静态成员函数与普通成员函数的差别就在于缺少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<<"析构:"<<name<<endl; 
 
    if(point==this) 
    { 
        point=this->next; 
        cin.get(); 
        return; 
    } 
    for(Student *ps=point;ps;ps=ps->next) 
    { 
        if(ps->next==this) 
        { 
        cout<<ps->next<<""<<this->next<<endl; 
        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) 
    { 
        cout<<fp->name<<endl; 
        fp=fp->next; 
    } 
    cin.get(); 
}  从上面的代码来看,原来单纯结构化编程需要的一个链表进入全局指针在这里被类的静态成员指针所替代(类的静态成员完全可以替代全局变量),这个例子的理解重点主要是要注重观察类成员的析构顺序,通过对析构顺序的理解,使用析构函数来进行节点的脱链操作。  更多文章 更多内容请看C/C++技术专题专题,或
上一篇:入门教程:实例详解C++友元 人气:679
下一篇:C++类对象的复制-拷贝构造函数 人气:761
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐