c++八股:const与static
1.const
const可以修饰变量(局部,全局),函数(函数参数,函数返回值,成员函数)。
const修饰的数据是存储在.rodata区就是常量数据区,string也是放在这个区()。
const主要的作用就是让数据不会被更改。
1.1变量
1.1.1一般情况
const修饰变量的时候,局部变量和全局变量基本没区别,存储的位置都是.rodata区,都不能被更改,只不过局部变量只有在局部才可以访问。
编译器可能会对const修饰的数据进行优化使得预处理的时候就直接变为常量。
1.1.2修饰指针和引用
修饰引用
叫做常量引用
const int a = 10;
const int& b = a; // 声明一个常量引用,引用常量 a
b = 20; // 非法,无法通过常量引用修改常量 a 的值
const修饰的是int&,所以不能修改值的大小,引用又不能像指针一样指向别的地方,所以它什么都不能改
修饰指针
1.指向只读变量的指针
const int *p; // 声明一个指向只读变量的指针,可以指向 int 类型的只读变量
int a = 10;
const int b = 20;
p = &a; // 合法,指针可以指向普通变量
*p = 30; // 非法
a = 30; // 合法
p = &b; // 合法,指针可以指向只读变量
*p = 30; // 非法,无法通过指针修改只读变量的值
const修饰int*,就是指针指向可以随便改,但是它不能改别人的值,即使别人的值是可以改的(比如这里的a)。
2.只读指针
int a = 10;
int b = 20;
int* const p = &a; // 声明一个只读指针,指向 a
*p = 30; // 合法,可以通过指针修改 a 的值
p = &b; // 非法,无法修改只读指针的值
const修饰指针p,就是不可以更改指向,但是它可以改指的东西的值。
3.只读指针指向只读变量
const int a = 10;
const int* const p = &a; // 声明一个只读指针,指向只读变量 a
*p = 20; // 非法,无法通过指针修改只读变量的值
p = nullptr; // 非法,无法修改只读指针的值
那就是啥都不能改了
2.static
static可以修饰变量(全局,局部,成员变量),函数(正常函数,成员函数)。
在 C++ 中,static的核心含义是:“将实体从动态、共享的外部世界收束到当前编译单元或当前作用域内,使其生命周期与程序静态存储期绑定,从而限制可见性、避免命名冲突、保持状态持久。”
其实static主要可以做两件事:1.限制作用域;2.控制变量生命周期。
2.1变量
1. static 修饰全局变量:将变量的作用域限定在当前文件中,使得其他文件无法访问该变量。这是限制了作用域。
2. static 修饰局部变量:使得变量在函数调用结束后不会被销毁可以继续使用。这是改变了生命周期。
3. static 修饰类成员变量:使得它们在所有类对象中共享,且不需要创建对象就可以直接访问。这也是改变了生命周期。
2.2函数
1. static 修饰函数:限定在当前文件中,使得其他文件无法访问该函数。限制作用域。
4. static 修饰类成员函数:使得它们在所有类对象中共享,且不需要创建对象就可以直接访问。类中的函数被调用时也不用传入this参数。改变生命周期。
3.const与static的差别
const修饰的变量和函数就是不能变、不能改,有恒定的意味。
static修饰的变量和函数更多的是改变了它们的作用域和生命周期。static修饰的变量不是恒定的是可以变的。
更多推荐


所有评论(0)