MST

星途 面试题库

面试题:C++中静态函数与普通成员函数的区别

请详细阐述C++中静态函数和普通成员函数在访问权限、调用方式、作用域以及对成员变量的访问等方面有哪些区别。
48.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

访问权限

  • 静态函数:访问权限与普通成员函数一样,受类的访问修饰符(public、private、protected)限制。但静态函数主要用于提供与类相关但不依赖于特定对象状态的功能,通常定义为public,以便外部直接调用。
  • 普通成员函数:同样受类的访问修饰符限制,通过对象访问时,根据对象的访问权限决定能否访问该函数。

调用方式

  • 静态函数:可以通过类名直接调用,格式为类名::静态函数名(参数列表);也可以通过对象调用,但不推荐,因为静态函数不依赖于对象实例。例如:
class MyClass {
public:
    static void staticFunction() {
        std::cout << "This is a static function" << std::endl;
    }
};

int main() {
    MyClass::staticFunction(); // 推荐方式
    MyClass obj;
    obj.staticFunction(); // 也可通过对象调用,但不推荐
    return 0;
}
  • 普通成员函数:必须通过对象来调用,格式为对象名.函数名(参数列表)指针->函数名(参数列表)。例如:
class MyClass {
public:
    void memberFunction() {
        std::cout << "This is a member function" << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.memberFunction(); 
    MyClass* ptr = &obj;
    ptr->memberFunction(); 
    return 0;
}

作用域

  • 静态函数:属于类的作用域,它的作用范围在整个类内,即使没有对象实例化也存在。
  • 普通成员函数:也属于类的作用域,但只有在对象被创建后,通过对象才能访问其作用域内的功能。

对成员变量的访问

  • 静态函数:只能访问静态成员变量,因为静态函数不依赖于具体对象,没有this指针,无法访问非静态成员变量(非静态成员变量依赖于对象实例)。例如:
class MyClass {
public:
    static int staticVar;
    int nonStaticVar;
    static void staticFunction() {
        std::cout << "Static var: " << staticVar << std::endl; 
        // std::cout << "Non - static var: " << nonStaticVar << std::endl;  // 错误,无法访问非静态变量
    }
};
int MyClass::staticVar = 10;
  • 普通成员函数:可以访问静态成员变量和非静态成员变量,因为普通成员函数通过对象调用,有this指针指向调用该函数的对象,能访问对象的所有成员变量。例如:
class MyClass {
public:
    static int staticVar;
    int nonStaticVar;
    void memberFunction() {
        std::cout << "Static var: " << staticVar << std::endl; 
        std::cout << "Non - static var: " << nonStaticVar << std::endl; 
    }
};
int MyClass::staticVar = 10;