1. class UserSubscriptionEntry
  2. {
  3. friend class AmSubscriptionEntry;
  4. friend class SmfSelSubscriptionEntry;
  5. public:
  6. static bool initialize(const string& xmlPath);
  7. private:
  8. UINT64 m_Supi;
  9. std::string m_SupiStr;
  10. static SYS::NumericMap<UINT64, UINT8> supi_amIndex_map;
  11. static SYS::NumericMap<UINT64, SYS::List <UINT8>* > supi_defaultSnssaiIndex_map

UserSubscriptionEntry 中定义的 public stacic的方法initialize 和 private static的变量supi_amIndex_map

Static:

静态成员的关键字,表示不能实例化,在你运行的时候他自己已经在内存中开辟了块空间,所以不用new, 可以直接调用。类似全局变量。
特点:
1、访问static成员,用类而不是实例化的对象;
2、static方法只能访问static属性;
3、static成员可以保留其值

Private Static & Public Static

private static: 字面上看private的意思是私有的, 所以使用private关键字表示该变量或方法必须在本类中使用, 如果调用, 必须调用的方法必须是静态的, 也就是说必须用static修饰.

public static: public(公共的)则表示在任何地方都能调用该方法或变量, 且无限制调用的地方是否静态.
demo:
form1内定义:
private sataic string aa;
public static string bb;
form2内访问:
form1.aa=”abc”; //这句能不能访问到变量aa,private限定了只能在类内部访问,这与static无关
from1.bb=”YYY”; //这句话可以访问到变量bb, public static在任何地方可以无限制调用

总结:

private static 和 public static 都是静态变量,在类加载时就定义,不需要创建对象。但是private static 是私有的,不能在外部访问,只能通过静态方法调用,这样可以防止对变量的修改。

https://blog.csdn.net/whiskey_wei/article/details/81137906
image.png

3、什么时候用static?
需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
4、static的内部机制:
静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数前的全局数据声明和定义处。
静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态
数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。
5、static的优势:
可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率

所以,在其他类的方法中使用方法为:
UserSubscriptionEntry::initialize(mUeSubsProfilePath));

  1. if(UserSubscriptionEntry::getAmSubIndex(supi, amIndex) != 0)

就可以直接赋值静态数据成员 或者 获取静态数据成员

所以,虽然声明的static SYS::NumericMap > supi_defaultSnssaiIndex_map;
是privite, 但是声明为public static的成员函数(*静态方法)
getDefaultNssaiIndex调用

  1. SYS::List<UINT8>* UserSubscriptionEntry::getDefaultNssaiIndex(UINT64 supi)
  2. {
  3. SYS::List<UINT8>* snssaiIndexList = NULL;
  4. supi_defaultSnssaiIndex_map.get(supi, snssaiIndexList);
  5. return snssaiIndexList;
  6. }

而getDefaultNssaiIndex 是public static类型 可以给外部调用。

image.png

等于是所有类共有的,全局的。

==================================================================
public 修饰是非静态方法,该类方法属于对象,在对象初始化(new Object())后才能被调用;
public static 修饰是静态方法,属于类,使用类名.方法名直接调用。

1、public static 表示公共的静态方法;public 表示公共的方法。
static:静态。可以设置:静态类、静态变量、静态方法。 没有使用static修饰的成员为实例成员。静态成员的使用:通过类名。
不加static修饰的成员是对象成员,归每个对象所有。
加static修饰的成员是类成员,可以由一个类直接调用,为所有对象共有。
用static关键字标识的程序元素是静态的,不用static标识的程序元素是非静态。

public static代表是静态方法,可以不通过创建所属对象进行访问;直接public代表是非静态方法,需要先new一个对象进行访问。
通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。
如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。