看完不要跟我说你学不会‘static‘和‘const‘(全网最详细版本,满满干货)

本文详细介绍了C和C++中的static关键字的用法,包括限制作用域、保持局部变量状态和定义静态成员。同时,解释了const关键字的作用,用于声明常量并保证其值的不可修改性。文章讨论了这两个关键字在全局变量、局部变量、函数和类成员中的应用,并总结了它们的区别。

前言

今天学习之余水群的时候有人问到什么是’static’和’const’以及它们之间的区别是什么,深思熟虑之后决定写篇博客总结一下,以防忘记也为了和不懂的同学们讲一下。

一、‘static’是什么?

在C和C++语言中,'static’是一个关键字,具有不同的含义和用法,用于限制作用域、保持状态、定义静态成员等,根据上下文和需求进行理解和使用。

二、'static’使用步骤

1.C:

  • 全局变量的声明
test.c
static type Variable;
int main(){...}
other.c
extern type Variable;//在其他文件中使用时需要使用extern关键字声明
int main(){...}

当‘static’修饰全局变量时,该变量的作用域限制在声明它的源文件内,其他源文件无法访问该变量。这使得全局变量在不同的源文件之间具有局部性,并且可以避免与其他文件中同名的全局变量冲突。

  • 在函数内部的局部变量声明中
void Test(){
  static type Variable = 0;//静态局部变量,初始化一次
  ++Variable;
  printf("Variable: %d\n",Variable);
}
int main(){
  Test();//Variable:1
  Test();//Variable:2
  Test();//Variable:3
  return 0;
}

当’static’修饰函数内的局部变量时,该变量在函数执行期间保持存在,并且只被初始化一次。下一次调用该函数时,该变量仍然保留上一次调用的值。这样的变量被称为静态局部变量。存储在静态区中。

  • 在函数声明中
test.c
static void Test();

static void Test(){...}//函数定义

void Function(){
   Test();//可以在同一文件中调用
}
other.c
Test();//错误,无法调用

当‘static’修饰函数声明时,该函数的作用域限制在定义它的源文件内,其他源文件无法调用该函数。这样可以实现在一个文件中定义私有的辅助函数或实现文件内的私有函数。

  • 在函数定义中
test.c
//将函数的定义和声明结合在一起
static void Test(){
...//定义
}

void Function(){
   Test();//可以在同一文件中调用
}
other.c
Test();//错误,无法调用

当‘static’修饰函数定义时,该函数的作用域限制在定义它的源文件内,其他源文件无法调用该函数。这与在函数声明中使用’static’关键字的效果相同,但将函数的定义和声明结合在一起。

2.C++:

  • 在类中的静态成员变量
class Solution{
public:
   static type Variable;//声明
 ...
};

itn Solution::Variable = 10;//静态成员变量的定义和初始化

int main(){
     //通过类名和作用域解析运算符访问静态成员变量
     cout << Solution::Variable << endl; //输出:10
     
     Solution::Variable = 20; //修改静态成员变量的值

     return 0;
 }

'static’修饰类的成员变量时,该变量被称为静态成员变量,它在所有类的实例之间共享,而不是每个实例拥有自己的副本。静态成员变量可以在类的任何实例之间访问,并且可以通过类名和作用域解析运算符“: :"来访问,而不需要创建类的实例

  • 在类的静态成员函数:
class Solution{
public:
   static int add(type a,type b)
   {
        return a+b;
   }
};

int main(){
     //通过类名和作用域解析运算符访问静态成员函数
     int result = Solution::add(5,3);
     
     cout << result << endl; //输出:8

     return 0;
 }
 ...

当‘static’修饰类的成员函数时,该函数被称为静态成员函数不依赖于类的实例,可以直接通过类名调用。静态成员函数不依赖于类的实例,可以直接通过类名调用。静态成员函数只能访问类的静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数

三、‘static’总结

总结来说,‘static’在C和C++语言中具有多种用法,包括限制全局变量和函数的作业域,保持函数内的局部变量状态,定义私有的辅助函数,声明和定义类的静态成员变量和静态成员函数。每种用法都有其特定的含义和功能,根据具体的上下文和需求进行使用。

需要注意的是,虽然C和C++中的’static’关键字在某些用法上有相似之处,但在其他情况下可能会有差异。在C++中,‘static’关键字还可以用于命名空间、模板和类模板等方面,而在C语言中则不适用。

此外还有一种使用’static’关键字的用法是在函数参数声明中,它的作用是将函数参数声明为静态参数,这样在函数调用时,参数的值会在多次调用之间保持持久,而不是每次调用都重新初始化。然而,这种用法在标准的C和C++中并不存在,可能是一些特定编译器或扩展的非标准用法。

总而言之,‘static’关键字在C和C++中具有不同的含义和用法,用于限制作用域、保持状态、定义静态成员等,根据上下文和需求进行理解和使用。

四、'const’是什么?

在C/C++中,’const’是一个关键字,它允许你指定一个语义约束,而编译器会强制实施这项约束。它表示所声明的标识符(变量、函数参数、函数返回类型等)是不可修改的,即其值在声明后不能被修改。
你可以用它在classes外部修饰global或namespace作用域中的常量,或修饰文件、函数、或区块作用域中被声明为static的对象。也可以用它修饰classes内部的static和non-static成员变量。面对指针,你也可以指出指针自身、指针所指物,或两者都(或都不)是const。

五、‘const’的使用

1.C:

  • 'const’关键字用于声明只读的变量
const int MAX_VALUE = 100;
  • 函数参数
int printValues(const int x,const int y){
     //不可以修改参数x和y的值
     printf("%d,%d",x,y);
     return x + y;
}
  • 指针以及指针所指物
char greeting[] = "Hello";
char* p0 = greeting;//non-const pointer,non-const data
const char* p1 = greeting;//non-const pointer,const data
//char const* p1 = greeting;等价于上面这种写法,指向一个常量的(不变的)字符数组greeting
char* const p2 = greeting;//const pointer,non-const data
const char* const p3 = greeting;//const pointer,const data
  • 函数返回类型
const int printValues(const int x,const int y){
     //不可以修改参数x和y的值
     printf("%d,%d",x,y);
     return x + y;
}

2.C++:

  • 声明只读的变量:
const int MAX_VALUE = 100;
  • 函数参数声明为只读:
void printValues(const int x,const int y){
     //不可以修改参数x和y的值
     cout << "x: " << x << "y: " << y << endl;
}
  • 成员函数声明只读:
class Solution{
public:
    int getValue() const {
    //不可以修改成员变量的值
    return value;
    }
    
private:
   int value;
};
  • 成员变量声明为只读:
class Solution{
public:
   const int MAX_VALUE = 100;
};
  • 指针以及指针所指物
  • 函数返回类型

六、'const’总结

在上述例子中,使用’const’关键字将变量、函数参数、成员函数以及成员变量等声明为只读,以确保其值不会被修改。这有助于提高代码的可靠性、可读性和可维护性,防止对常量的无意修改或错误修改。

七、'static’和’const’的区别是什么?

'static’和’const’是C和C++中两个不同的关键字,具有不同的用途和含义。它们的区别如下:

  1. 作用域不同:
    • ‘static’关键字用于限制标识符(变量、函数、类成员等)的作用域。在不同的上下文中,它可以用于限制全局变量、函数、类成员的作用域。
    • ’const’关键字用于声明一个常量,它指示标识符的值是不可修改的。它并不影响标识符的作用域。
  2. 可变性不同:
    • ‘static’关键字并不直接关联变量的可变性。它只作用于控制标识符的作用域和生命周期。
    • ’const’关键字用于声明只读的变量,即其值在声明后不能被修改。
  3. 用途不同
    • ‘static’关键字用于实现静态变量、静态函数和静态成员等。它可以用于在不同的上下文中实现局部性、保持状态、限制作用域等功能。
    • ’const’关键字用于声明常量,用于表示不可变的数据或参数。

需要注意的是,‘static’和‘const’关键字可以结合使用,例如声明静态常量,即同时将标识符的作用域限制为所在的源文件,并使其值不可修改。

总结来说,’static’用于控制作用域和实现静态特性,而‘const’用于声明常量并保证其值的不可修改性。它们是不同的关键字,用于不同的目的。

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全天

加油,大佬们!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值