在C++中,static
和const
是两个关键字,它们各自有不同的用途和语法。下面是它们的主要区别和用法:
const
关键字
const
关键字用于声明一个常量,即该变量的值在初始化后不能被修改。
用法:
-
局部变量:
void func() { const int a = 10; // a 是一个常量,值为10,不能在函数内部修改 // a = 20; // 错误:不能给常量赋值 }
-
全局变量:
const int g_a = 10; // g_a 是一个全局常量
-
指针:
-
指向常量的指针:
const int *p = &a; // p 可以指向 int 类型变量,但不能通过 p 修改变量的值 // *p = 20; // 错误:不能通过 p 修改值
-
常量指针:
int a = 10; int *const p = &a; // p 是一个常量指针,指向 a,p 的值(即存储的地址)不能改变 // p = &b; // 错误:不能改变 p 的值
-
指向常量的常量指针:
const int *const p = &a; // p 指向一个常量 int,且 p 本身也是常量指针 // *p = 20; // 错误:不能通过 p 修改值 // p = &b; // 错误:不能改变 p 的值
-
-
类成员:
class MyClass { public: const int value; // 常量成员变量,必须在构造函数的初始化列表中初始化 MyClass(int v) : value(v) {} };
static
关键字
static
关键字用于声明静态变量或函数,具有不同的作用范围和行为,取决于它的使用上下文。
用法:
-
局部变量:
- 静态局部变量在函数内部声明,但其生命周期贯穿整个程序运行期。它只在第一次进入该函数时被初始化一次。
void func() { static int count = 0; // count 是一个静态局部变量,只在第一次调用 func 时初始化为 0 count++; std::cout << count << std::endl; }
- 静态局部变量在函数内部声明,但其生命周期贯穿整个程序运行期。它只在第一次进入该函数时被初始化一次。
-
全局变量:
- 静态全局变量仅在声明它的文件内部可见,具有内部链接(internal linkage)。
// file1.cpp static int globalVar = 10; // 仅在 file1.cpp 中可见 // file2.cpp // extern int globalVar; // 错误:无法访问 file1.cpp 中的 static 全局变量
- 静态全局变量仅在声明它的文件内部可见,具有内部链接(internal linkage)。
-
函数:
- 静态函数仅在声明它的文件内部可见。
// file1.cpp static void myFunction() { // 函数体 } // file2.cpp // void myFunction(); // 错误:无法访问 file1.cpp 中的 static 函数
- 静态函数仅在声明它的文件内部可见。
-
类成员:
- 静态类成员属于类本身,而不是某个对象实例。它们必须在类外部定义和初始化。
class MyClass { public: static int staticVar; // 静态成员变量 static void staticFunc() { // 静态成员函数 // 函数体 } }; int MyClass::staticVar = 10; // 静态成员变量的定义和初始化
- 静态类成员属于类本身,而不是某个对象实例。它们必须在类外部定义和初始化。
总结
const
用于声明常量,表示该变量的值不能被修改。static
用于声明静态变量或函数,具有延长生命周期或限制可见性的作用。