C++类中的静态成员变量和静态成员函数的作用
c++的static关键字用法

c++的static关键字用法C++中的`static`关键字有多种用法,在不同的场景下都有着不同的含义和作用。
本文将详细介绍C++中`static`关键字的用法及其相关特性,希望能对读者更好地理解和运用这个关键字。
一、`static`关键字概述`static`是C++中的一个关键字,它常用于指定函数、变量、类成员等的作用域和生命周期。
它的主要作用如下:1. 限定变量的作用域。
使用`static`关键字声明的变量具有静态的生存期和块作用域,即在整个程序运行期间都存在,并且只能在声明变量的源文件中访问。
2. 限定函数的作用域。
使用`static`关键字声明的函数具有静态的作用域,即只能在声明它的源文件中调用。
3. 限定类成员的作用域。
使用`static`关键字声明的类成员为静态成员,它不属于类的任何一个对象,而是属于整个类,可以通过类名或类对象来访问。
4. 防止符号重定义。
当在多个源文件中定义同名的全局变量或函数时,使用`static`关键字可以防止它们之间的符号重定义错误。
二、静态变量1. 全局静态变量使用`static`关键字声明的全局变量具有静态生存期和文件作用域,即它在程序运行期间一直存在,而且只能在声明它的源文件中访问。
例如:```cpp//file1.cpp#include <iostream>static int count = 10; //声明全局静态变量countvoid func() {static int i = 5; //局部静态变量i,生命周期为整个程序运行期间std::cout << "i is " << i ;std::cout << " and count is " << count << std::endl;i++;count++;}```在另一个源文件中引用这个全局静态变量,编译器会报错:```cpp//file2.cpp#include <iostream>extern int count; //声明全局变量countvoid func2() {std::cout << "count is " << count << std::endl;}```编译器会报错:undefined reference to `count'。
static静态函数的作用

static静态函数的作用静态函数的作用什么是静态函数?静态函数是编程语言中的一个概念,它与普通函数有所不同。
静态函数属于一个类或对象,但不依赖于任何特定的实例化对象。
它可以直接通过类名或对象名调用,不需要通过创建对象来访问。
静态函数的特点1.独立性:静态函数不依赖于具体的对象实例,可以直接调用。
2.共享性:静态函数属于类或对象,所有实例化的对象共享同一个静态函数。
3.访问权限:可以在外部访问静态函数,但无法访问非静态的成员变量。
静态函数的作用静态函数在编程中有多种作用,包括但不限于以下几个方面。
1. 简化代码实现静态函数可以用于简化代码实现,尤其是一些只需要简单计算或执行特定任务的函数。
通过使用静态函数,可以直接通过类名调用函数,无需创建对象,节省了代码编写的时间和精力。
2. 高效的工具函数静态函数还可以作为高效的工具函数来使用。
在开发过程中,可能会有一些常用的函数,比如日期时间处理、字符串处理等。
将这些函数定义为静态函数,可以直接通过类名调用,提高代码的可读性和维护性。
3. 共享数据的存储与访问静态函数可以通过静态变量来存储和访问共享的数据。
静态变量在内存中只有一个实例,无论创建多少对象,都会共享同一个静态变量的数值。
通过静态函数来访问这些静态变量,可以方便地实现数据共享,避免重复创建和赋值的操作。
4. 设计模式的实现静态函数在设计模式的实现中也有一定的应用。
比如单例模式中,为了确保一个类只有一个实例,通常会将构造函数设为私有,在类内部定义一个静态函数来创建和获取唯一实例。
这样就可以通过静态函数来实现全局统一的访问和控制。
总结静态函数在编程中有着重要的作用。
它简化了代码实现,提供了高效的工具函数,实现了数据共享和访问,同时也为设计模式的实现提供了一种机制。
在选择使用静态函数时,需要根据具体的需求和设计原则来进行判断和决策。
5. 封装与隐藏实现细节静态函数还可以用于封装和隐藏一些实现细节。
通过将一些内部实现逻辑定义为静态函数,并将其它函数设置为私有函数或受保护函数,可以限制对内部实现细节的访问。
C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解当将类的某个数据成员声明为static时,该静态数据成员只能被定义⼀次,⽽且要被同类的所有对象共享。
各个对象都拥有类中每⼀个普通数据成员的副本,但静态数据成员只有⼀个实例存在,与定义了多少类对象⽆关。
静态⽅法就是与该类相关的,是类的⼀种⾏为,⽽不是与该类的实例对象相关。
静态数据成员的⽤途之⼀是统计有多少个对象实际存在。
静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。
也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建⼀个类的对象则静态数据成员都要被重新初始化。
静态成员不可在类体内进⾏赋值,因为它是被所有该类的对象所共享的。
你在⼀个对象⾥给它赋值,其他对象⾥的该成员也会发⽣变化。
为了避免混乱,所以不可在类体内进⾏赋值。
数据类型类名::静态数据成员名=初值不能⽤参数初始化表对静态成员初始化。
⼀般系统缺省初始为0。
静态成员是类所有的对象的共享的成员,⽽不是某个对象的成员。
它在对象中不占⽤存储空间,这个属性为整个类所共有,不属于任何⼀个具体对象。
所以静态成员不能在类的内部初始化,⽐如声明⼀个学⽣类,其中⼀个成员为学⽣总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。
复制代码代码如下:#include "iostream"using namespace std;class test{private:int x;int y;public:static int num;static int Getnum(){x+=5; // 这⾏代码是错误的,静态成员函数不能调⽤⾮静态数据成员,要通过类的对象来调⽤。
num+=15;return num;}};int test::num = 10;int main(void){test a;cout<<test::num<<endl; //10test::num = 20;cout<<test::num<<endl; //20cout<<test::Getnum()<<endl; //35cout<<a.Getnum()<<endl; //50system("pause");return 0;}通过上例可知: x+=5; // 这⾏代码是错误的静态函数成员必须通过对象名来访问⾮静态数据成员。
C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。
一、在面向过程设计中的static关键字1、静态全局变量定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。
特点:A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。
例〔摘于C++程序设计教程---钱能主编P103〕://file1.cpp//Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){n=20;cout < <n < <endl;fn();}void fn(){n++;cout < <n < <endl;}D、文件作用域下声明的const的常量默认为static存储类型。
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。
对于一个完整的程序,在内存中的分布情况如以下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。
static函数在c语言中的用法

static函数在c语言中的用法在C语言中,静态函数(static function)是指在函数声明前加上static关键字的函数。
静态函数与非静态函数的主要区别在于,静态函数只能在声明所在的源文件中访问,不能被其他源文件调用。
以下是静态函数的用法和一些适当的拓展:1.限制函数的作用域:将函数声明为静态可以限制其只在当前文件中使用。
这样可以避免函数被其他文件中的函数或变量误用,提高代码安全性和可维护性。
2.可以避免与其他文件中相同名称的函数产生冲突:当不同文件中定义了相同名称的函数时,编译器会报错。
使用静态函数可以避免这种冲突,因为它们只在当前文件中可见。
3.减小程序的内存占用:静态函数只在声明所在的源文件中可见,其他文件无法调用。
因此,编译器在编译其他文件时不会为静态函数分配内存空间,从而减小了程序的内存占用。
4.提高函数的执行效率:由于静态函数只在当前文件中使用,编译器可以对其进行优化。
在调用静态函数时,编译器可以直接生成机器码,而不需要通过函数指针等操作,从而提高函数的执行效率。
5.提供私有函数接口:静态函数只能在当前文件中使用,对其他文件隐藏了函数的具体实现。
这样可以实现一些私有函数接口,仅供当前文件中的函数调用,增加了代码的封装性。
需要注意的是,静态函数仍然需要通过函数原型进行声明和定义,以便编译器正确解析函数调用和参数传递。
静态函数的定义可以在函数声明前或后,但必须在调用之前。
总结:静态函数在C语言中主要用于限制函数的作用域、避免函数冲突、减小内存占用、提高执行效率和提供私有函数接口等方面。
c++不同对象之间共享数据的方法

文章标题:探讨C++中不同对象之间共享数据的方法在面向对象的编程中,对象间的数据共享是一个常见且重要的问题。
在C++中,存在许多不同的方法可以实现不同对象之间的数据共享,本文将以此为主题展开讨论。
1. 使用静态成员变量静态成员变量是类的所有对象之间共享的数据。
通过在类中声明静态成员变量,并在类外初始化,不同对象之间即可共享该数据。
然而,静态成员变量可能存在线程安全性和数据封装性问题,需要进行适当的处理。
2. 使用全局变量全局变量可以在整个程序中被访问,因此不同对象可以通过全局变量进行数据共享。
但是,全局变量的可见性和封装性较差,容易导致程序的混乱和不可维护性。
3. 使用引用参数在函数参数中使用引用,可以让不同对象之间在函数调用时共享数据。
通过传递引用参数,可以直接操作对方对象的数据,实现数据共享。
但是,需要注意引用的生命周期和可变性,避免出现数据不一致的情况。
4. 使用全局指针通过全局指针指向某一对象的数据,不同对象之间可以通过该指针进行数据共享。
然而,全局指针可能存在内存泄漏和空指针引用的问题,需要谨慎使用。
5. 使用消息传递机制通过消息传递机制,不同对象之间可以通过消息进行数据共享。
消息传递可以是同步的,也可以是异步的,可以实现对象间的松耦合和数据安全性。
然而,消息传递需要额外的设计和实现,可能增加程序的复杂性。
总结回顾:在C++中,实现不同对象之间的数据共享有多种方法,每种方法都有其特点和适用场景。
选择合适的数据共享方法需要根据具体的需求和情况加以考量,避免出现数据不一致或安全性问题。
合理的数据共享方案可以提高程序的灵活性和可维护性。
个人观点和理解:在不同对象之间实现数据共享是一项具有挑战性的任务,需要考虑数据的安全性、封装性和可维护性等方面。
我认为,合理设计和选择数据共享方法是提高程序质量和效率的关键之一,值得我们在实际编程中持续关注和研究。
在文章中多次提及主题文字:数据共享、对象间的数据共享、不同对象之间的数据共享希望本文对你有所帮助,如果有任何问题或需要进一步了解,欢迎与我联系。
static在c++语言中的用法

static在c++语言中的用法static是C++中的一个关键字,用于定义静态变量和静态函数。
静态变量和普通变量的区别在于,静态变量存储在数据区,生命周期与整个程序运行时间相同,在程序运行时只会被初始化一次。
而普通变量在程序运行时会被重复初始化和销毁,生命周期与函数调用时间相同。
1. 静态变量静态变量可以声明在函数体内和类内部。
当静态变量声明在函数体内时,该变量只在此函数中可见,即使此函数被多次调用,静态变量只会被初始化一次。
当静态变量声明在类内部时,它属于整个类,不需要通过对象来访问,可以直接通过类名+范围解析符(::)来访问。
如:静态变量在类内部的声明可以用于实现单例模式。
如下代码实现了只能创建一个MyClass对象的单例模式:2. 静态函数静态函数的另一个用途是实现工厂模式。
当我们需要创建一些对象并且它们的类型在编译时不能确定时,可以使用工厂模式来创建这些对象。
静态函数可以作为工厂函数,用于创建对象的实例。
如下代码:3. 静态成员变量和静态函数的限制1. 静态成员变量需要在类外部进行初始化。
即使不进行初始化,编译器也会为它自动赋值为0。
2. 静态成员变量的访问权限可以是public、protected或private。
3. 静态成员变量可以在类声明中提供初值,如`static int myStaticVar = 0;`。
4. 静态函数不能声明为const,因为const只能用于成员函数,而静态函数没有对象,无法成为成员函数。
5. 静态函数可以被继承,但不能被override(覆盖),因为静态函数与类名绑定在一起,无法被子类的同名函数所覆盖。
但是,如果子类中声明一个与父类中静态函数同名的静态函数,它并不会覆盖父类中的静态函数,而是在子类中新增一个同名函数。
6. 静态函数不能访问非静态的成员函数和变量。
如果需要访问非静态成员,必须通过对象来调用成员函数。
但是,由于静态函数没有对象,无法调用非静态成员函数。
static变量和static函数的各自的特点

static变量和static函数的各自的特点static变量大致分为三种用法一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.二、用于全局变量,主要作用是限制此全局变量被其他的文件调用.三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象static 声明的变量在C语言中有两方面的特征:1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
Tips:A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static 变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
函数前加static使得函数成为静态函数。
但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。
随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。
为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。
一、在面向过程设计中的static关键字1、静态全局变量定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。
特点:A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。
例(摘于C++程序设计教程---钱能主编P103)://file1.cpp//Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){n=20;cout < <n < <endl;fn();}void fn(){n++;cout < <n < <endl;}D、文件作用域下声明的const的常量默认为static存储类型。
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。
对于一个完整的程序,在内存中的分布情况如下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。
自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。
全局数据区的数据并不会因为函数的退出而释放空间。
细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为:int n; //定义全局变量程序照样正常运行。
的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;(好像是区别extern的)其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量(只能在本文件中使用)void main(){n=20;cout < <n < <endl;fn();}//File2#include <iostream.h>extern int n;(可在别的文件中引用这个变量)void fn(){n++;cout < <n < <endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但link时出现错误。
试着将static int n; //定义静态全局变量改为int n; //定义全局变量再次编译运行程序,细心体会全局变量和静态全局变量的区别。
2、静态局部变量定义:在局部变量前加上static关键字时,就定义了静态局部变量。
我们先举一个静态局部变量的例子,如下://Example 3#include <iostream.h>void fn();void main(){fn();fn();fn();}void fn(){static n=10;cout < <n < <endl;n++;}通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。
但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
但有时候我们需要在两次调用之间对变量的值进行保存。
通常的想法是定义一个全局变量来实现。
但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。
静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
特点:A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0,以后的函数调用不再进行初始化。
C、它始终驻留在全局数据区,直到程序运行结束。
但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
3、静态函数(注意与类的静态成员函数区别)定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。
特点:A、静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
静态函数的例子://Example 4#include <iostream.h>static void fn();//声明静态函数void main(){fn();}void fn()//定义静态函数{int n=10;cout < <n < <endl;}定义静态函数的好处:静态函数不能被其它文件所用;其它文件中可以定义相同名字的函数,不会发生冲突;二、面向对象的static关键字(类中的static关键字)1、静态数据成员在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
先举一个静态数据成员的例子。
//Example 5#include <iostream.h>class Myclass{public:Myclass(int a,int b,int c);void GetSum();private:int a,b,c;static int Sum;//声明静态数据成员};int Myclass::Sum=0;//定义并初始化静态数据成员Myclass::Myclass(int a,int b,int c){this->a=a;this->b=b;this->c=c;Sum+=a+b+c;}void Myclass::GetSum(){cout < <"Sum=" < <Sum < <endl;}void main(){Myclass M(1,2,3);M.GetSum();Myclass N(4,5,6);N.GetSum();M.GetSum();}可以看出,静态数据成员有以下特点:对于非静态数据成员,每个类对象都有自己的拷贝。
而静态数据成员被当作是类的成员。
无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。
也就是说,静态数据成员是该类的所有对象所共有的。
对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。
所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;静态数据成员存储在全局数据区。
静态数据成员定义时要分配空间,所以不能在类声明中定义。
在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;静态数据成员和普通数据成员一样遵从public,protected,private访问规则;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;静态数据成员初始化与一般数据成员初始化不同。
静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>类的静态数据成员有两种访问形式:<类对象名>.<静态数据成员名>或<类类型名>::<静态数据成员名>如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员;静态数据成员主要用在各个对象都有相同的某项属性的时候。
比如对于一个存款类,每个实例的利息都是相同的。
所以,应该把利息设为存款类的静态数据成员。
这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。
第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;可以实现信息隐藏。
静态数据成员可以是private成员,而全局变量不能;2、静态成员函数与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。
静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。
普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。
通常情况下,this是缺省的。
如函数fn()实际上是this->fn()。
但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。
从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
下面举个静态成员函数的例子。
//Example 6#include <iostream.h>class Myclass{public:Myclass(int a,int b,int c);static void GetSum();/声明静态成员函数private:int a,b,c;static int Sum;//声明静态数据成员};int Myclass::Sum=0;//定义并初始化静态数据成员Myclass::Myclass(int a,int b,int c){this->a=a;this->b=b;this->c=c;Sum+=a+b+c; //非静态成员函数可以访问静态数据成员}void Myclass::GetSum() //静态成员函数的实现{// cout < <a < <endl; //错误代码,a是非静态数据成员cout < <"Sum=" < <Sum < <endl;}void main(){Myclass M(1,2,3);M.GetSum();Myclass N(4,5,6);N.GetSum();Myclass::GetSum();}关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,。