首页 > 代码库 > 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++静态成员
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。