在 C++ 里,static
是一个用途广泛的关键字,在不同场景下有不同含义,下面为你详细介绍:
1. 全局变量前的 static
当 static
用在全局变量前时,它会改变变量的链接属性。
- 默认全局变量:默认的全局变量具有外部链接属性,这意味着在一个文件中定义的全局变量可以在其他文件中通过
extern
关键字声明后使用。 - 静态全局变量:在全局变量前加上
static
关键字后,变量变为静态全局变量,具有内部链接属性,只能在定义它的文件中使用,其他文件无法访问。
示例代码:
// file1.cpp #include <iostream> // 静态全局变量 static int staticGlobalVar = 10; // 普通全局变量 int globalVar = 20; void printStaticGlobalVar() { std::cout << "Static global variable: " << staticGlobalVar << std::endl; } // file2.cpp #include <iostream> // extern int staticGlobalVar; // 错误,无法在其他文件中访问静态全局变量 extern int globalVar; int main() { // std::cout << staticGlobalVar << std::endl; // 错误 std::cout << "Global variable: " << globalVar << std::endl; return 0; }
2. 局部变量前的static
当 static
用于局部变量时,它会改变变量的存储方式和生命周期。
- 普通局部变量:普通局部变量存储在栈上,在函数调用结束后会被销毁。
- 静态局部变量:静态局部变量存储在全局数据区,只在第一次调用函数时初始化,之后再次调用函数时,静态局部变量会保留上一次调用结束时的值。
示例代码:
#include <iostream> void staticLocalVariableExample() { static int staticLocalVar = 0; // 静态局部变量 int normalLocalVar = 0; // 普通局部变量 std::cout << "Static local variable: " << staticLocalVar << std::endl; std::cout << "Normal local variable: " << normalLocalVar << std::endl; staticLocalVar++; normalLocalVar++; } int main() { staticLocalVariableExample(); staticLocalVariableExample(); return 0; }
3. 函数前的 static
当 static
用于函数前时,它会改变函数的链接属性。
- 默认全局函数:默认的全局函数具有外部链接属性,可以在其他文件中通过
extern
关键字声明后调用。 - 静态函数:在函数前加上
static
关键字后,函数变为静态函数,具有内部链接属性,只能在定义它的文件中调用,其他文件无法访问。
示例代码:
// file1.cpp #include <iostream> // 静态函数 static void staticFunction() { std::cout << "This is a static function." << std::endl; } // 普通函数 void normalFunction() { std::cout << "This is a normal function." << std::endl; } // file2.cpp #include <iostream> // extern void staticFunction(); // 错误,无法在其他文件中调用静态函数 extern void normalFunction(); int main() { // staticFunction(); // 错误 normalFunction(); return 0; }
4. 类的静态成员变量
类的静态成员变量属于整个类,而不是类的某个对象,所有对象共享同一个静态成员变量。
- 存储位置:静态成员变量存储在全局数据区,不随对象的创建和销毁而分配和释放内存。
- 初始化:静态成员变量必须在类外进行初始化。
示例代码:
#include <iostream> class MyClass { public: static int staticMemberVar; // 类内声明静态成员变量 int normalMemberVar; MyClass(int value) : normalMemberVar(value) {} }; // 类外初始化静态成员变量 int MyClass::staticMemberVar = 0; int main() { MyClass obj1(10); MyClass obj2(20); obj1.staticMemberVar = 30; std::cout << "obj2.staticMemberVar: " << obj2.staticMemberVar << std::endl; // 输出 30 return 0; }
5. 类的静态成员函数
类的静态成员函数属于整个类,而不是类的某个对象,可以直接通过类名调用,也可以通过对象调用。
- 无
this
指针:静态成员函数没有this
指针,因此不能访问类的非静态成员变量和非静态成员函数,只能访问类的静态成员变量和静态成员函数。
示例代码:
#include <iostream> class MyClass { public: static int staticMemberVar; int normalMemberVar; static void staticMemberFunction() { staticMemberVar = 10; // 可以访问静态成员变量 // normalMemberVar = 20; // 错误,不能访问非静态成员变量 std::cout << "Static member function called. staticMemberVar: " << staticMemberVar << std::endl; } }; int MyClass::staticMemberVar = 0; int main() { MyClass::staticMemberFunction(); // 通过类名调用静态成员函数 MyClass obj; obj.staticMemberFunction(); // 通过对象调用静态成员函数 return 0; }
综上所述,static
关键字在不同的位置有不同的含义,主要体现在改变变量和函数的链接属性、存储方式、生命周期以及实现类的共享成员等方面。
到此这篇关于C++ static的使用方法及不同作用的文章就介绍到这了,更多相关C++ static使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源链接:https://www.jb51.net/program/3399203i5.htm
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容