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;//错误
};

  

  

上一篇:Access denied for user 'root'@'localhost' (using password:YES) 解决方案[转]


下一篇:微信小程序wx.showLoading