访问权限
- 静态函数:访问权限与普通成员函数一样,受类的访问修饰符(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;