const和static的使用

本文详细解释了C/C++语言中const和static的使用方法,包括const的作用在于保护变量不被意外修改,static则用于限定作用域和存储方式,减少命名冲突,并在模块内部保持变量值的连续性。


const和static的使用

使用const。
    这一点在很多经典的关于C 和C++的书籍中是必谈的要点。在《Exceptional C++》一书中,对这点有很精彩的描述,现摘录如下:“没有正确的安全意识的枪手在世界上是不可能活的很长的。const 观念不正确的程序员也是一样和没有时间戴紧帽子的正确,没有时间检查带电电线的电工一样不会活的很长。”在C 语言中,const 修饰符表示告诉编译器此函数将不会改变被修饰的变量的指向的任何值(除了强制类型转换)。当把指针作为参数传递时,总是合适地使用const,不仅可以防止你无意中错误的赋值,而且还可以防止在作为参数将指针传递给函数时可能会修改了本不想改变的指针所指向的对象的值。如:
const int num= 7;
num = 9; //有/可能得到编译器的警告。
const char *ptr,则表示该指针所指向的内容不会被改变,如果在程序中被发生对其赋值的操作,编译时将出错误提示。如:
const char *ptr = “hello”;
*ptr = 'H';//错误,所指内容不可改变也可将const 放在星号后面来声明指针本身不可改变。如:
char* const ptr;
ptr++; //错误,指针本身不可改变
也可同时禁止改变指针和它所引用的内容,其形式如下: const char* const ptr;
使用static
    static 是一个能够减少命名冲突的有用工具。将只在一个模块文件中的变量和函数使用static 修饰,将不会和其他模块可能具有相同名称的函数和变量在模块连接时不会产生名称冲突。一般来说,只要不是提供给其它模块使用的函数,和非全局变量,均应使用static 修饰。将子程序中的变量使用static 修饰时,表示这个变量在程序开始时分配内存,在程序结束时释放,它们在程序执行期间保持它们的值。如:
void func1(void)
{
static int time = 0;
time++
}
void func2(void)
{
static int time = 0;
time++;
}
两个子程序中的time 变量使用static 修饰,所以它们是静态变量,每调用一次time将进行加1,并保持这个值。它们的功能与下面程序相似:
int time1 = 0;
int time2 = 0;
void func1(void)
{
time1++
}
void func2(void)
{
time2++;
}
我们可以看出,使用static 修饰后,模块中的全局变量减少,使得程序的更为简单。




对于C/C++语言来讲,
const就是只读的意思,只在声明中使用;
static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.
static const 应该就是上面两者的合集.
下面分别说明:
全局:
const,只读的全局变量,其值不可修改.
static,规定此全局变量只在当前模块(文件)中可见.
static const,既是只读的,又是只在当前模块中可见的.
文件:
文件指针可当作一个变量来看,与上面所说类似.
函数:
const,返回只读变量的函数.
static,规定此函数只在当前模块可见.
类:
const,一般不修饰类,(在VC6.0中试了一下,修饰类没啥作用)
static,C++中似乎没有静态类这个说法,一般还是拿类当特殊的变量来看.C#中有静态类的详细说明,且用法与普通类大不相同.

在C++中,conststatic是两个重要的关键字,用于修饰变量、函数类成员,以不同方式控制数据的生命周期、访问权限存储方式[^1][^3]。 ### const变量 const关键字用于定义常量,被const修饰的变量不能被写入或修改,其值在整个程序运行期间保持不变。例如: ```cpp const int num = 10; // 以下语句会编译错误,因为num是常量不能被修改 // num = 20; ``` 使用场景: - 当需要一个值在程序运行过程中保持不变时,使用const可以提高代码的安全性可读性。例如,定义数学常量π: ```cpp const double PI = 3.1415926; ``` - 在函数参数中使用const,可以防止函数内部修改传入的参数。例如: ```cpp void printValue(const int value) { // 不能修改value的值 std::cout << value << std::endl; } ``` ### static变量 static主要影响变量的存储链接可见性。static修饰的变量可以被写入修改,除非它们也被const修饰。 - **局部静态变量**:在函数内部使用static修饰的变量,会在程序的整个运行期间存在,而不是像普通局部变量那样在函数退出时销毁。例如: ```cpp void func() { static int count = 0; count++; std::cout << count << std::endl; } ``` 在这个例子中,count变量只会在第一次调用func函数时初始化,之后每次调用func函数,count的值会保留上一次调用结束时的值。 - **全局静态变量**:在全局作用域中使用static修饰的变量,其作用域仅限于定义它的文件,其他文件无法访问。例如: ```cpp // file1.cpp static int globalStaticVar = 10; // file2.cpp // 无法访问file1.cpp中的globalStaticVar ``` - **类的静态成员变量**:在类中使用static修饰的成员变量,属于类本身,而不是类的某个对象。所有对象共享同一个静态成员变量。例如: ```cpp class MyClass { public: static int staticMember; }; // 静态成员变量需要在类外进行初始化 int MyClass::staticMember = 0; ``` ### conststatic变量的区别 - **可修改性**:const修饰的变量不能被修改,而static修饰的变量可以被修改,除非同时被const修饰[^5]。 - **存储作用域**:const变量只是表示其值不可变,存储作用域取决于其定义的位置;而static变量主要影响存储链接可见性,局部静态变量有更长的存储期,全局静态变量的作用域仅限于定义它的文件。 ### conststatic一起使用staticconst一起使用时,如`static const int x = 100;`,意味着变量x是一个在单个文件内可见的常量,其值在整个程序运行期间不变,并且在函数调用之间保持其值[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值