[email protected]类的静态成员变量和静态成员函数

参考:

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

  

  

时间: 2024-12-26 07:43:38

[email protected]类的静态成员变量和静态成员函数的相关文章

C++ 类中的静态成员变量,静态成员函数

//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 静态成员函数是属于整个类, static修饰的变量,是属于类,,所有的对象都能共享用. 在类的静态数据成员函数中,是不能调用具体的对象的变量的属性, 这是因为static修饰的变量是整个类共享,在静态成员函数中使用一个对象的成员属性 c++编译器无法知道这个成员属性是哪个对象的 所以在静态成员函数中只能使用静

C++类中的静态成员变量与静态成员函数

最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员先于类的声明而存在于内存,也可以根据类声明的对象来访问.而非静态成员必须实例化之后才会分配内存. 非静态成员的概念: 所有没有加static的成员都是非静态成员.而类被实例化后,可以通过实例化的类

类静态成员变量和静态成员函数的访问方式

1.在类所有实例中静态成员变量和静态成员函数都只有一份拷贝 2.静态成员函数不能调用非静态成员,非静态成员函数可以调用静态成员 3.静态成员变量在使用前要初始化 一.静态成员变量的访问 class B { public: static int a; }; int B::a=0;//必须要先初始化 int main(){ cout<<B::a<<endl; return 0; } 二.静态成员函数的访问 class B { public: static void a(){ print

static作用,静态成员变量和静态成员函数

static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用static是在全程序中控制名字的另一种方法.这些名字不会与全局名冲突,并且可见性和访问也限制在程序内部,使得在维护代码时有更多的控制. 数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静

C++静态成员变量和静态成员函数使用总结

       C++静态成员变量和静态成员函数使用总结: 一.静态成员变量: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态数据成员还具有以下特点: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中. 其定义方式与全局变量相同.举例如下: xxx.h文件 class base{ pr

(转)MVC语法[email&#160;protected]和@functions(Razor内定义函数)

(转)MVC语法[email protected]和@functions(Razor内定义函数) 转自:http://www.mikesdotnetting.com/Article/173/[email protected]@Functions-In-WebMatrix The Difference Between @Helpers and @Functions In WebMatrix This is another post which was inspired by a recent qu

C++类中的静态成员变量与静态成员函数的使用

代码: 1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 5 using namespace std; 6 7 class A{ 8 public: 9 static int a; 10 //static int a = 0; //编译不通过,无法在类内初始化 11 int b; 12 static void func1(){ 13 cout<<"static func&

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

C++中静态成员变量和静态成员函数(面向过程&amp;&amp;面向对象)

数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态          成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员  存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成             员的生存期决定于该类的生存