国外java代码例子经典 国外java英文视频教程( 五 )


这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数前的全局数据声明和定义处 。
静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员) 。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配 , 所以在类声明中写成定义是错误的 。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义 。
static被引入以告知编译器 , 将变量存储在程序的静态存储区而非栈上空间,静态
数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了 。消除时的顺序是初始化的反顺序 。
5、static的优势:
可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用 。静态数据成员的值对每个对象都是一样,但它的值是可以更新的 。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率 。
6、引用静态数据成员时,采用如下格式:
类名::静态成员名
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中 , 按上述格式
来引用静态数据成员 。
7、注意事项:
(1)类的静态成员函数是属于整个类而非类的对象 , 所以它没有this指针,这就导致
了它仅能访问类的静态数据和静态成员函数 。
(2)不能将静态成员函数定义为虚函数 。
(3)由于静态成员声明于类中,操作于其外 , 所以对其取地址操作 , 就多少有些特殊
,变量地址是指向其数据类型的指针  , 函数地址类型是一个“nonmember函数指针” 。
(4)由于静态成员函数没有this指针 , 所以就差不多等同于nonmember函数,结果就
产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W
indow系统结合,同时也成功的应用于线程函数身上 。
(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问
时间,节省了子类的内存空间 。
(6)静态数据成员在定义或说明时前面加关键字static 。
(7)静态数据成员是静态存储的,所以必须对它进行初始化 。
(8)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private , public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
数据类型类名::静态数据成员名=值
(9)为了防止父类的影响 , 可以在子类定义一个与父类相同的静态变量 , 以屏蔽父类的影响 。这里有一点需要注意:我们说静态成员为父类和子类共享 , 但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志 。
[编辑本段]static 函数
内部函数和外部函数
当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数 。
1 内部函数(又称静态函数)
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数 。

推荐阅读