静态函数
#include
class Point {
public: void output()//非静态成员函数 {
} static void init()//静态成员函数 {
} };
调用1:非静态成员函数和非静态成员属于对象的方法和数据,也就是先产生类的对象,然后通过类的对象去引用。
void main() {
Point pt; pt.init();//编译成功 pt.output();//编译成功 }
调用2:静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,所以可通过类名::函数名,类名::变量名来访问。
void main() {
Point::init();//编译成功。不属于某个具体的对象,Point类没有构造对象之前,init已经存在,即分配了代码区空间。 Point::output();//编译失败。非法调用非静态成员函数,即Point构造对象后,output才存在。 }
调用3:静态成员函数只能调用静态成员变量。
#include
class Point {
public: void output()//非静态成员函数 {
x = 0; y = 0; } static void init()//静态成员函数 {
x = 0; //静态成员函数调用非静态成员 y = 0; } private: int x, y; //非静态成员 }; void main() {
Point::init();//编译失败。静态成员函数不能调用非静态成员的成员函数和成员变量。init已存在,x,y不存在。 Point pt;//构造pt对象时,给x,y分配内存空间,给output分配代码区空间。 pt.output();//编译成功。 }
函数之间的引用许可,内存模型: 无论采什么样的操作,程序代码都是在内存中运行的,只有在内存中占有了一席之地,我们才能够访问它。如果一个成员函数或成员变量还未在内存中产生,结果是无法访问它的。
调用4:类外初始化静态成员变量。非静态成员函数可以调用静态成员函数。
#include
int Point::x = 0; int Point::y = 0;//类外初始化静态成员变量 class Point {
public: void output()//非静态成员函数 {
init(); //非静态成员函数调用静态成员函数 } static void init()//静态成员函数 {
x = 0; //静态成员函数调用静态成员 y = 0; } static int x, y; //静态成员变量 }; void main() {
Point::init();//编译成功。 Point pt; pt.output();//编译成功。 }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220145.html原文链接:https://javaforall.net
