C++中的static使用方法

一、静态数据成员(static data members)

    在介绍静态数据成员之前,我们先来看看普通的数据成员(data members):

class complex
{
public:
  double real() const {return this -> re;} //在成员函数的参数列表(小括号)中,有隐藏的参数this pointer,是不能写出来的。
private:
  double re,im;
}
complex c1,c2;
cout << c1.real();
cout << c2.real();

通过对象调用函数时,形式其实相当于:

complex c1,c2,c3;
cout << complex::real(&c1);
cout << complex::real(&c2);

简单来说,谁调用成员函数,谁就相当于this pointer。在上面的程序中,c1的地址就成为this pointer。

    静态数据成员:类中的数据成员声明前加上static关键字,该数据成员就成为该类的静态数据成员。静态数据成员有以下几个特点:

(1)静态数据成员是所有对象所共用的,包括该类派生类的对象,即派生类对象和基类对象共用基类的静态数据成员。类的静态成员是属于类的,与类本身直接相关,不是属于哪个对象的,因此可以说是所有对象所共用的;

(2)和普通成员一样,静态数据成员可以是public和private;

(3)静态数据成员要在类体内声明,类体外定义和初始化;

(4)引用静态数据成员时,要在静态数据成员前加<类名>和作用域运算符。

二、静态成员函数(static member functions)

    静态成员函数:类中使用static修饰的成员函数。有以下几个特点:

(1)静态成员函数的地址可以用普通函数指针存储,而普通成员函数的地址要用类成员函数的指针来存储;

(2)静态成员函数只能处理静态数据,因为静态成员函数没有this pointer;

(3)静态成员函数不可以声明为virtual或const函数。

下面来看一个关于静态数据成员和静态成员函数的例子:

class Account
{
public:
  static double m_rate;//静态数据成员,类中声明
  static void set_rate(const double& x) {m_rate = x;}
};
double Account::m_rate = 8.0;//静态数据成员在类外初始化

int main()
{
  Account::set_rate(5.0);//通过class name调用static函数

  Account a;
  a.set_rate(7.0);//通过object调用static函数(因为静态成员函数中没有this pointer,才能如此调用)
}

       静态函数不包含有编译器提供的隐藏的this指针,它在类没有实例化的时候就存在,所以可以直接用,并且由于没有this指针,所以也就没有特定的成员变量供它用,因为类没有实例化前,这些类成员变量不存在,系统也没有分配空间给这些变量,且没有this指针,也无法调用这些成员变量,所以他只能使用那些类没有实例化前就已经存在的静态变量。同时,静态成员也是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

       普通成员函数因为创建时传递了一个默认的this指针,所以意味着每一个对象都有一组自己的成员变量,这就意味着它可以使用这些成员变量,同时也可以使用静态成员变量,因为这些变量在对象还没创建出来之前就已经存在。

       普通成员函数要通过对象调用,因此要首先建立一个对象;而静态成员函数可不以建立对象就可以被使用。因此,与类的非静态数据成员无关的成员函数,虽然可以被定义为非静态函数,但是如果定义为静态函数的话在使用上会更加方便。


你可能感兴趣的:(C++)