Python的静态成员变量
在学习Python类的过程中,发现Python类中定义的成员变量直接就是属于类的静态成员变量。既然这样的话,说明这个成员变量为该类的所有实例对象所共享。比如下面的类:
class Student:
student_cnt = 0
def __init__(self, name, number):
self.name = name
self.number = number
Student.student_cnt += 1
def displayNumberOfStudent(self):
print Student.student_cnt
def displayStudentInfo(self):
print 'name: ', self.name, 'number: ', self.number
在上述Student类中,成员student_cnt为类的静态变量,在类的所有实例化对象中所共享。
可以在类的外面或者类的里面使用Student.student_cnt来访问。
C++的静态成员【静态成员变量和静态成员函数】
在C++中,静态成员也是属于整个类。静态成员变量只存储一份供所有对象共用【这点与Python相同】。
使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。
C++中使用静态成员的注意事项:
1. 不能通过类名来调用类的非静态成员函数;
2. 类的对象可以使用类的静态成员函数和非静态成员函数;
3. 静态成员函数中不能使用非静态成员;
4. 类的非静态成员函数可以调用静态成员函数;
5. 类的静态成员变量在使用前需要在类的外部进行初始化。
把握一点:静态成员在类创建时就已经分配内存,而非静态成员是在创建类对象时分配内存。所以不能在已经分配内存的地方使用还未分配内存的事物。
实例代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
class Point
{
public:
void init()
{
cout<<"init function"<<endl;
//合法---类的非静态成员函数中调用静态成员函数
output();
//合法---类的非静态成员函数中调用静态成员变量
m_static = 1;
}
static void output()
{
cout<<"static void output"<<endl;
//非法---类的静态成员函数中不能使用还未分配内存的非静态成员变量
//m_nonStatic = 0;
}
private:
int m_nonStatic;
static int m_static;
};
//注:类的静态成员变量在使用前需要先在类的外部进行初始化
int Point::m_static = 0;
void main()
{
//非法:不能通过类名来调用非静态成员函数
//Point::init();
//合法
Point::output();
Point pt;
//合法
pt.init();
//合法
pt.output();
}
参考网址
http://blog.youkuaiyun.com/morewindows/article/details/6721430#quote