C++@类的静态成员变量和静态成员函数
参考:
http://blog.csdn.net/morewindows/article/details/6721430
http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html
分析Qt程序时,碰到下面代码。
QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );
静态成员变量 | 静态成员函数 | |
概念定义 |
被所有的类的对象所共享的变量。 即此变量是属于这个类的,它只被存储一份供所有的对象使用。 |
不访问对象的任何数据,但是又是对象的成员函数,则声明为静态成员函数。 |
形式体现 | 在类中定义静态成员变量时,前面加static | 在类中定义静态成员函数时,最前面加static |
调用方法 | <类名>::<静态成员名> |
<类名>::<静态成员名>(较为常见) <类对象名>.<静态成员函数>(较少用) |
语法规则 |
类域中的全局变量,其定义不能放在头文件中,以防重复定义。 被所有类的对象所共享,包括派生类的对象。 类的静态成员变量必须先初始化然后使用。 |
静态成员函数可以使用<类名>::<静态成员名>方式调用,但是普通成员函数不可以这样调用。 不能在类的静态成员函数中使用非静态成员,因为静态成员函数不含this指针。 但是可以在类的非静态成员函数中使用静态成员。 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。 静态成员函数不可以同时声明为 virtual、const、volatile函数。 |
静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。 静态成员可以成为成员函数的可选参数,而普通数据成员不可以。 静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。 |
class Point { public: void init() { } static void output() { } }; void main() { Point::init(); Point::output(); } //编译出错:error C2352: 'Point::init' : illegal call of non-static member function //上述main()可以改为 void main() { Point pt; pt.init(); pt.output(); } //编译通过
#include <stdio.h> class Point { public: void init() { } static void output() { printf("%d\n", m_x); } private: int m_x; }; void main() { Point pt; pt.output(); } //编译出错:error C2597: illegal reference to data member 'Point::m_x' in a static member function
class Point { public: void init() { output(); } static void output() { } }; void main() { Point pt; pt.output(); } //编译通过
#include <stdio.h> class Point { public: Point() { m_nPointCount++; } ~Point() { m_nPointCount--; } static void output() { printf("%d\n", m_nPointCount); } private: static int m_nPointCount; }; void main() { Point pt; pt.output(); } //编译通过,运行错误。改正:在main()函数前加上int Point::m_nPointCount = 0;
class base{ public : static int _num;//声明 }; int base::_num=0;//静态数据成员的真正定义 class derived:public base{ }; main() { base a; derived b; a._num++; cout<<"base class static data number _num is"<<a._num<<endl; b._num++; cout<<"derived class static data number _num is"<<b._num<<endl; } // 结果为1,2;可见派生类与基类共用一个静态数据成员。
class base{ public : static base _object1;//正确,静态数据成员 base _object2;//错误 base *pObject;//正确,指针 base &mObject;//正确,引用 };
class base{ static int func1(); int func2(); }; int (*pf1)()=&base::func1;//普通的函数指针 int (base::*pf2)()=&base::func2;//成员函数指针 class base{ virtual static void func1();//错误 static void func2() const;//错误 static void func3() volatile;//错误 };