前言
这里简单记录一下C++中静态成员变量和静态成员函数,主要是涉及一些相关知识和初始化内容。
记录于此,方便自己查阅。
正文
在类的成员变量或函数上添加关键字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
小结
一个类中,静态成员变量被所有的类对象共享,即无论定义多少个类对象,静态成员变量都只有一个。
如果静态成员变量被修改,则所有对象的静态成员变量都将发生改变。
注意
对于静态成员变量,下面几点需要注意。
静态类成员变量可以是当前类的对象,非静态类成员只能是当前类的指针
class BiuMall { public: static int age ; //静态变量 //BiuMall biumall; // 错误, 不允许使用不完整的类型 BiuMall* biumallP; //正确 //指针对象 static BiuMall biuamallStatic; //正确 静态类对象 };
静态成员变量可作为类成员函数的默认参数,普通成员变量则不允许作为成员函数的默认参数。
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)
这是因为没有给静态类成员变量没有初始化。
静态类成员变量不会自动初始为0,需要主动初始化
局部变量未初始化,默认值未知(VS会提示需要初始化)
全局变量(包括static修饰)默认会初始化为0
下面是正确的代码:
class BiuMall { public: static int age ; }; //初始化 int BiuMall::age = 10; int main() { std::cout << BiuMall::age << std::endl; }
静态成员函数
在成员函数前添加static关键字,即可为类定义一个静态成员函数。
注意事项:
静态成员函数只能访问静态成员变量,不能访问普通成员变量。
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;
静态成员函数不能定义为const类型,即静态成员函数末尾不能使用const关键字。
class BiuMall { public: static int age_static ; // 静态成员函数上不允许使用类型限定符 // static int getAge() const { // return age_static; // } }; //初始化静态变量 int BiuMall::age_static = 10;
定义静态成员函数时,如果函数实现代码在类体外,则不能使用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; }
参考文章
《C++从入门到精通(第6版)》
《
历史上的今天
© 版权声明