静态数据成员:
1.静态数据成员实际上是类域中的全局变量。
2.静态数据成员的初始化在主函数调用之前,并且不能在类的声明中出现。
3.静态数据成员的状态并不会随着一个新的对象的新建而重新定义。
4.静态数据成员的使用应该是类名称加区域分隔符加静态成员名称的,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态态类成员的特性就是属 于类而不专属于某一个对象
5.不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。
6.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。
1 class base{
2 public :
3 static int _num;//声明
4 };
5 int base::_num=0;//静态数据成员的真正定义
6
7 class derived:public base{
8 };
9
10 main()
11 {
12 base a;
13 derived b;
14 a._num++;
15 cout<<"base class static data number _num is"<<a._num<<endl;
16 b._num++;
17 cout<<"derived class static data number _num is"<<b._num<<endl;
18 }
19 // 结果为1,2;可见派生类与基类共用一个静态数据成员。
7.静态数据成员可以成为成员函数的可选参数,普通数据成员则不行。
8.静态数据成员的类型可以是所属类的类型,普通的成员则不行,普通成员只可以是所属类的指针或者引用。
class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};
静态成员函数:
1.静态函数地址可以用普通函数指针存储,普通函数成员地址必须由类成员函数指针存储。
1 class base{
2 static int func1();
3 int func2();
4 };
5
6 int (*pf1)()=&base::func1;//普通的函数指针
7 int (base::*pf2)()=&base::func2;//成员函数指针
2.静态成员函数属于类,没有this指针,所以不可以调用类的非静态成员。
3.静态成员函数不可以同时声明为const virtual volatile。
1 class base{
2 virtual static void func1();//错误
3 static void func2() const;//错误
4 static void func3() volatile;//错误
5 };
1) const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数
2)静态成员函数, 可以不通过 对象来调用,也即没有隐藏的this指针。
virtual函数一定要通过对象来调用,即有隐藏的this指针。
原文链接:http://www.cnblogs.com/cy568searchx/archive/2013/03/12/2955701.html
原文链接: https://www.cnblogs.com/cy568searchx/archive/2013/04/02/2995407.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/83026
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!