首页 > 代码库 > C++静态成员

C++静态成员

本文地址:http://www.cnblogs.com/archimedes/p/cpp-static2.html,转载请注明源地址

静态数据成员

定义:

以关键字static声明的数据成员

class Box{public:    int volume() const;private:    int iwitch;    int length;    int heigth;    static int count;};

初始化:

静态数据成员必须初始化且只能在类外初始化,初始化时不能加static,格式:

类型 类名::静态数据成员名 [= 初值];

class Box{public:    int volume() const;private:    int iwitch;    int length;    int heigth;    static int count;};int Box::count; //必须在类外初始化

注意:不能通过构造函数初始化、不能通过初始化列表初始化

访问:

静态数据成员属于类而不属于具体的对象,为不同对象共有。因此,公有静态数据成员在类外的访问方式有两种

类名::公有静态数据成员

对象名.公有静态数据成员

静态数据成员可被其所在类的任何成员函数直接引用
void Box::display()const{     cout << Box:: s_iCount << " ";     cout << s_iCount << " ";}

存储:

静态数据成员编译时开辟内存单元,占据全局区类的对象创建前就能使用。

静态数据成员的内存单元独立开辟,不属于具体的某个对象,为不同的对象共有。

为什么要引入静态数据成员?

各对象之间的数据有了沟通的渠道,实现了数据的共享,C++中涉及到对象之间的数据共享时应使用静态数据成员,而不要使用全局变量,因为全局变量不能体现封装特性。

#include <iostream>using namespace std;class Type{public:    Type(int ax=0);    static int s_value;    void print();private:    int m_value;};int Type::s_value;Type::Type(int ax){    m_value=ax;}void Type::print(){    cout<<"m_value=http://www.mamicode.com/"        <<++m_value        <<endl;    cout<<"s_value=http://www.mamicode.com/"        <<++s_value        <<endl;}int main(){    Type::s_value=90;    Type c1,c2;    c1.print();    c2.print();    system("PAUSE");    return 0;}

应用举例:统计创建对象的个数

#include <iostream>#include <string>using namespace std;class student{public:    student(string aName="codingwu")    {        strName=aName;        count++;        cout << "Cons"<<" "<<strName <<endl;    }    ~student()    {        count--;        cout<< "Des"<<" "<<strName<<endl;    }    void printCount()const    {        cout<<"COUNT = "<<count<<endl;    }private:    static int count;    string strName;};int student::count;int main(){    student stu("li");    student stu1("zhang");    student *p=new student[5];    delete []p;    student("hahahaha");    stu.printCount();    system("PAUSE");    return 0;}

运行结果:

技术分享

静态成员函数

1、概念:

      用static声明的成员函数

2、访问方式:
      属于类类型的而不属于具体对象

3、特点

①静态成员函数专门用于访问静态成员(包括数据成员和成员函数)

②是属于类的而不属于具体对象,因此既可以通过类名访问,也可以通过对象名引用

③其实静态成员函数就是在类内的全局函数

④静态成员函数没有this指针
#include <iostream>using namespace std;class Type{public:    static void print();    Type(int aValue = http://www.mamicode.com/0);private:    int m_iValue;    static int s_iValue;};int Type::s_iValue;Type::Type(int aValue){      m_iValue = aValue;    s_iValue++;}void Type::print(){      //cout << ++m_iValue;//Error    cout << s_iValue << endl;}int main(){     Type::print();     Type c1,c2;     c1.print();      c2.print();      return 0;}

注意:

非静态成员函数可以访问本类中的任何成员

静态成员函数专门用于访问静态成员,不能直接访问非静态成员。

#include <iostream>#include <string>using namespace std;class Student{public:    Student(int aNum=0,int aAge=0,double aScore=0);    void total();    static double s_average();    double m_iScore;private:        static int s_iCount;//对象个数        static double s_iSum;//总成绩    int m_iNum;    int m_iAge;};double Student::s_iSum;int Student::s_iCount;Student::Student(int aNum,int aAge,double aScore):m_iNum(aNum),m_iAge(aAge),m_iScore(aScore){}void Student::total(){    s_iSum += m_iScore;    s_iCount++;}double Student::s_average(){    return s_iSum/s_iCount;}int main(){    Student stud[3] =     {        Student(1001,18,60),        Student(1002,19,90),        Student(1005,20,0),    };    for(int i = 0;i<3;i++)        stud[i].total();    cout << Student::s_average()<<endl;    system("PAUSE");    return 0;}

 

C++静态成员