C++静态成员函数

原创 2015年11月17日 16:10:48
类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。
静态类成员包括静态数据成员和静态函数成员两部分。

一 静态数据成员:

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:

1.静态数据成员的定义。
静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
其定义方式与全局变量相同。举例如下:

xxx.h文件
class base{
private:
static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
};

xxx.cpp文件
const int base::_i=10;//定义(初始化)时不受private和protected访问限制.

注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
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;可见派生类与基类共用一个静态数据成员。

3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
};

4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:

class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};

5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
静态数据成员的值在const成员函数中可以被合法的改变。举例如下:

class base{
public:
base(){_i=0;_val=0;}

mutable int _i;
static int _staticVal;
int _val;
void test() const{//const 成员函数

_i++;//正确,mutable数据成员
_staticVal++;//正确,static数据成员
_val++;//错误

}
};
int base::_staticVal=0;

二,静态成员函数
静态成员函数没有什么太多好讲的。

1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
};

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针


2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
class base{
virtual static void func1();//错误
static void func2() const;//错误
static void func3() volatile;//错误
};


最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

C++ 静态成员和静态成员函数

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。使用惊涛成员变量可以实现多个对象之间的数据共享而不会破坏隐藏的原则, 保证了安全性还可以节省内存。    静...
  • LinuxIPLinux
  • LinuxIPLinux
  • 2015年04月20日 08:14
  • 897

C++类的常成员函数以及静态成员函数

1 常成员函数 1.1声明:函数名(形参列表)const; 1.2说明: 1)const是函数类型的一部分,在实现部分也要带上该关键字; 2)const关键字可以用于对重载函数的区分; 3)...
  • scorpion_zs
  • scorpion_zs
  • 2016年02月15日 11:37
  • 1130

C++使用静态成员函数

描述一下问题: 在一个类中写了一个比较函数: 我们知道,对于sort和equal这样的函数,除了指定迭代器之外,还可以指定一个函数指针(比较函数),来定义自己的比较方法,比如说,我最近写了在做leet...
  • zhangxiao93
  • zhangxiao93
  • 2016年04月27日 23:39
  • 859

C++里的静态成员函数不能用const的原因

static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。    不能用const的原因: ...
  • freeboy1015
  • freeboy1015
  • 2012年06月05日 16:23
  • 2551

C++函数调用之静态成员函数

首先,定义如下类A: class A { private: static int val_s; public: static int getVal(){cout ...
  • C12345SDN
  • C12345SDN
  • 2014年09月06日 11:27
  • 2790

c++静态成员函数为什么不能为虚函数?

知乎用户 three passions govern my life 2 人赞同 可以把静态成员函数看作是“命名空间受限的普通函数”,所以它不能有运行时多态 发布...
  • dreamzuora
  • dreamzuora
  • 2017年01月10日 12:55
  • 982

c++-静态成员函数和非静态成员函数的区别

1.virtual与静态函数 C++中,静态成员函数不能被声明为virtual函数。 例如,下面的程序会编译失败。#include class Test { public: ...
  • qq_30968657
  • qq_30968657
  • 2017年04月05日 10:28
  • 500

关于编译器对c++ 类静态成员、静态成员函数、非静态成员函数的处理

静态成员函数: 在C++编译器中会把静态成员变量当作全局变量处理,如同全局变量一样将其放在静态、全局变量区(栈区),只不过其可见性限制为类对象区域。 非静态成员函数: C++并不...
  • jluliuxy
  • jluliuxy
  • 2015年05月06日 15:49
  • 561

C/C++——为什么类的静态成员函数在定义的时候不写static?

解释一:举个例子,Base是一个类,data是他的int型static数据成员,那么我们这么定义:int Base::data = 10;1、因为使用static数据成员时,都是Base::data。...
  • sinat_36053757
  • sinat_36053757
  • 2017年05月23日 09:51
  • 684

C语言中的static函数,C++中的静态成员和静态成员函数

C语言中static函数的作用: C程序一直由下列部分组成:       1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;       2)初始...
  • wang15061955806
  • wang15061955806
  • 2016年04月13日 14:12
  • 872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++静态成员函数
举报原因:
原因补充:

(最多只允许输入30个字)