关键点(c++,Linux)
一:类内的静态成员函数只能直接访问类的静态成员(包括静态变量和静态函数),而不能直接访问类的非静态成员(包括普通成员变量和普通成员函数)。
1. 可以直接访问的权限
类的所有静态成员变量:无论这些静态成员是
public
、protected
还是private
的。类的其他静态成员函数:同样,不受访问权限的限制。
原因:静态成员属于类本身,而不是任何一个对象。它们在程序的生命周期内只有一份实例,与对象的创建和销毁无关。静态成员函数也正是为管理和操作这些“类级别”的静态数据而设计的。
2. 不可以直接访问的权限
类的非静态成员变量:不能直接读取或修改普通成员变量。
类的非静态成员函数:不能直接调用普通的成员函数
普通(非静态)成员函数在被调用时,编译器会隐式地传递一个指向当前调用对象的指针,即 this
指针。通过 this
指针,函数才能知道它要操作的是哪个特定对象的数据。
而静态成员函数不与任何对象相关联,它属于整个类。因此,编译器不会向静态成员函数传递 this
指针。既然没有 this
指针,它自然就无法确定要访问哪个对象的非静态成员。
一旦一个类内的成员函数被声明为静态的(static),那么就可以不创建该类的任何对象实例,直接通过类名和作用域解析运算符(::)来访问这个函数。这是静态成员函数的一个基本特性和设计目的。
二:
类内的静态成员变量的初始化要在类外,注意初始化并不是访问,而是“定义存储空间 + 赋初值”。
这一操作属于编译器/链接器层面的要求,跟权限检查不是一回事。所以私有静态变量也是可以在类外初始化的。
为什么要在类外初始化:
普通成员变量:属于对象,每个对象都有一份。内存是在对象构造时分配的。
静态成员变量:属于类,而不是对象,所有对象共享同一份存储空间。
类内写
static int y;
只是声明,并没有分配存储空间。编译器只知道“有这么一个名字”,但不知道要在数据段分多少内存。
所以必须在类外写一份:
三:
全局/静态变量是线程共享的。局部静态变量也是线程共享的。
函数内部的局部变量是线程私有的。
四:
五:静态局部变量的初始化是线程安全的,即使多个线程同时进入,也只会初始化一次。