前言

这里简单记录一下C++静态成员变量静态成员函数,主要是涉及一些相关知识和初始化内容。

记录于此,方便自己查阅。

正文

类成员包括两类:

  1. 成员变量表示类的属性,可以是整型浮点型字符型数组指针引用等,也可以是对象。

  2. 成员函数表示类的行为。

在类的成员变量或函数上添加关键字static,那就是成为了静态成员变量静态成员函数

静态成员变量

静态类成员是在类成员定义前使用static关键字

class BiuMall { public:  static int age; };  //静态变量初始化 int BiuMall::age = 10;

我这个C++版本不支持类内部初始化,下面注意事项有相关介绍。

静态类成员不仅属于类的对象,也属于类。因此,可以通过如下几种方式访问静态类成员变量。

int main() {  std::cout << BiuMall::age << std::endl;  BiuMall::age++; //+1  BiuMall biumall;  std::cout << biumall.age << std::endl;  BiuMall::age++; //+1   BiuMall* biumallP = &biumall;  std::cout << biumallP->age << std::endl; }

输出结果:

10  11 12
小结
  1. 一个类中,静态成员变量被所有的类对象共享,即无论定义多少个类对象,静态成员变量都只有一个。

  2. 如果静态成员变量被修改,则所有对象的静态成员变量都将发生改变。

注意

对于静态成员变量,下面几点需要注意。

  1. 静态类成员变量可以是当前类的对象,非静态类成员只能是当前类的指针

    class BiuMall { public:  static int age ;   //静态变量  //BiuMall biumall; // 错误, 不允许使用不完整的类型  BiuMall* biumallP; //正确 //指针对象  static BiuMall biuamallStatic; //正确 静态类对象 };
  2. 静态成员变量可作为类成员函数的默认参数,普通成员变量则不允许作为成员函数的默认参数。

    class BiuMall { public:  static int age_static ;   //静态变量  int addOne(int age = age_static) {  return age+1;  }  static int addTwo(int age = age_static) {  return age + 2;  }   int age_no_static;  //int subOne(int age = age_no_static) { // 提示:非静态成员引用必须与特定对象相对  // return age - 1;  //} };

    使用

    int main() {  BiuMall biumall;  std::cout << biumall.addOne() << std::endl; }
错误

注意,静态成员变量需要初始化,要不然使用就有异常。

错误1
//错误1 class BiuMall { public:  //static int age = 5; // 提示 :带有类内初始值设定项的成员必须为常量。 };

从C++17开始支持static变量在类内部初始化。

错误2
//错误2 class BiuMall { public:  static int age; };  int main() {  std::cout << BiuMall::age << std::endl;  }

没有提示,但编译无法通过

无法解析的外部符号 "public: static int BiuMall::age" (?age@BiuMall@@2HA)

这是因为没有给静态类成员变量没有初始化。

  1. 静态类成员变量不会自动初始为0,需要主动初始化

  2. 局部变量未初始化,默认值未知(VS会提示需要初始化)

  3. 全局变量(包括static修饰)默认会初始化为0

下面是正确的代码:

class BiuMall { public: static int age ; }; //初始化 int BiuMall::age = 10; int main() { std::cout << BiuMall::age << std::endl; }

静态成员函数

在成员函数前添加static关键字,即可为类定义一个静态成员函数。

注意事项:

  1. 静态成员函数只能访问静态成员变量,不能访问普通成员变量。

    class BiuMall { public: static int age_static ; //静态变量 int age; // 错误,非静态成员引用必须与特定对象相对 // static int getAge() { // return age; // } // 正确 static int getAge() { return age_static; } }; //初始化静态变量 int BiuMall::age_static = 10;

  2. 静态成员函数不能定义为const类型,即静态成员函数末尾不能使用const关键字。

    class BiuMall { public: static int age_static ; // 静态成员函数上不允许使用类型限定符 // static int getAge() const { // return age_static; // } }; //初始化静态变量 int BiuMall::age_static = 10;
  3. 定义静态成员函数时,如果函数实现代码在类体外,则不能使用static关键字。

    class BiuMall { public: static int age_static ; static int getAge(); }; //初始化静态变量 int BiuMall::age_static = 10; //错误,此处不能指定存储类 //static int BiuMall::getAge() { // return age_static; //} //正确 int BiuMall::getAge() { return age_static; }

参考文章

  1. 《C++从入门到精通(第6版)》

  2. 类中定义static变量后,visual studio编译时提示LNK2001“无法解析的外部符号”

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...