C++中静态变量能否被非静态函数访问?私有静态变量呢?
嘿,这两个关于C++静态变量的问题挺典型的,我来给你唠清楚:
一、静态变量是否可以被非静态函数访问?
这个得分两种情况来看,因为C++里的静态变量有不同的作用域:
- 文件作用域的全局静态变量:这种静态变量的作用域被限制在定义它的文件内,所以同一个文件里的非静态函数是可以直接访问它的,但其他文件的非静态函数哪怕用
extern声明也碰不到它。比如下面的代码:
#include <iostream> static int file_static = 10; // 只在当前文件可见的静态变量 void non_static_func() { std::cout << "访问文件静态变量:" << file_static << std::endl; // 完全没问题 } int main() { non_static_func(); return 0; }
- 类的静态成员变量:这种属于类的成员,类内部的非静态成员函数可以直接访问它;要是类外的非静态全局函数,能不能访问就得看这个静态变量的访问权限了——
public的话可以直接通过类名::静态变量名访问,private/protected的话就不行,毕竟权限摆着呢。举个例子:
class Test { public: static int public_static; private: static int private_static; public: void non_static_method() { // 非静态成员函数能访问public和private的静态变量 public_static = 20; private_static = 30; std::cout << "public_static: " << public_static << std::endl; std::cout << "private_static: " << private_static << std::endl; } }; int Test::public_static = 15; int Test::private_static = 25; void external_non_static_func() { // 类外非静态函数只能访问public的静态变量 std::cout << "外部访问public_static: " << Test::public_static << std::endl; // std::cout << Test::private_static << std::endl; // 这里会编译报错,权限不够 } int main() { Test obj; obj.non_static_method(); external_non_static_func(); return 0; }
二、类中private的静态变量,能否通过该类的非静态成员函数访问?
答案是完全可以!
类的非静态成员函数本质上还是类的一部分,它拥有访问类内所有成员的权限——不管是静态还是非静态,也不管是public、protected还是private。静态变量只是存储上属于整个类(不依附于单个对象),但访问权限的规则和普通的非静态成员是一样的。
看这个例子就明白了:
class MyClass { private: static int secret_static; // private的静态变量 public: void update_secret() { secret_static += 5; // 非静态成员函数直接修改private静态变量 std::cout << "当前secret_static的值:" << secret_static << std::endl; } }; // 类的静态成员必须在类外初始化 int MyClass::secret_static = 10; int main() { MyClass obj1, obj2; obj1.update_secret(); // 输出15 obj2.update_secret(); // 输出20,因为静态变量是类共享的 return 0; }
你看,obj1和obj2调用update_secret的时候,修改的是同一个静态变量,而且非静态成员函数完全能访问private的静态变量,一点问题都没有。
内容的提问来源于stack exchange,提问作者Kamal Ahmad
相关产品推荐
相关产品推荐

