欢迎访问宙启技术站
智能推送

静态函数与非静态函数的区别及使用方法

发布时间:2023-06-05 13:46:23

静态函数与非静态函数是面向对象编程中的两种常用函数类型,它们之间有很明显的区别。下面将对它们的区别和使用方法进行详细介绍。

1. 静态函数和非静态函数的定义

静态函数是指在类中定义的不能被对象调用的函数,也称为类函数。在函数定义前加上关键字static,表示该函数只能由所在类的静态成员访问,不需要对象的存在就可以被调用。非静态函数是指定义在类中并且可以被对象调用的函数,也称为成员函数。

class A {
    public:
    static int func1();//静态函数
    int func2();//非静态函数
};

int A::func1()
{
    return 1;
}

int A::func2() 
{
    return 2;
}

2. 静态函数和非静态函数的调用

静态函数可以直接使用类名或类的对象来调用,而非静态函数只能通过对象来调用。

A::func1();//用类名调用静态函数
A a;
a.func2();//用对象调用非静态函数

3. 静态函数和非静态函数的作用域

静态函数的作用域仅限于当前类,不能被其他类访问;非静态函数的作用域在当前类及其派生类中可访问。

class A {
    public:
    static void func1() {}
};

class B {
    public:
    void func2() { A::func1(); }//可以在派生类中访问基类的静态函数
};

B b;
b.func2();//用对象调用派生类的非静态函数,访问基类的静态函数

4. 静态函数和非静态函数的存储方式

静态函数存储在程序的数据段,只有一份拷贝,所有对象都共享这一份函数;非静态函数存储在程序的代码段中,每个对象都拥有一份独立的函数。

class A {
    public:
    static void func1() {}
    void func2() {}
};

int main() 
{
    cout<<sizeof(A::func1())<<"
";//输出8
    cout<<sizeof(A().func2())<<"
";//输出1
    return 0;
}

5. 静态函数和非静态函数的调用效率

静态函数由于没有了this指针传递,因此比非静态函数的调用效率高。

总结:静态函数和非静态函数都有各自的优势和应用场景,需要根据具体情况选择使用。静态函数适用于不需要访问对象成员的情况,而且处理速度更快;非静态函数适用于需要访问对象成员的情况,但调用效率相对较低。