文章目录
const
const是常量限定修饰符,告诉编译器,该变量不能被修改,使用const以避免在函数中对某些不应修改的变量造成可能的改动。
- const 左定值,右定向
const变量首先作用于左边;如果左边没有,作用于右边
1. const 常量
const常量和const数组是,const写的位置都是等价的
都是const先作用于左边,没有的话,然后作用于右边
int const c = 10;
const int c = 10; //与上面等价
int const con [3] = {1,2,3};
const int con [3] = {1,2,3};//与上面等价
2. const 指针
左定值,右定向,const修饰不变量。
//普通指针
char *p = "hahaha";
//
const char *p = "hahaha"; // const作用于char,const类型的数据
char *const p = "hahaha"; // const作用于指针,const类型的指针
const char *const p = "hahaha"; // const类型指针+const类型的数据
常量指针 const int*
不能修改值,但是可以修改地址。(const作用于int,int的值不能改变,但是指针指向地址可以改变)
不能改变指针的值,但是可以通过改变指针的指向地址、对象
int a = 1;
const int* p =&a;
*p = 20; // 错误,不能修改变量的值
int b = 2;
p = &b; // 正确,可以修改指针指向地址
指针常量 int *const
可以改变值,但是不能改变指向的地址(const作用于指针)
int a = 1;
const int* p =&a;
*p = 20; // 正确,可以修改变量的值
int b = 2;
p = &b; // 不正确,不可以修改指针指向地址
3. const修饰函数
const int con(int a) //const修饰函数返回值
int con(const int* a) //const修饰函数参数
int con(int a) const; //const修饰成员函数
const修饰函数参数
const 只能修饰输入作用的参数因为:
如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。
- 返回值为常量,const修饰函数返值,const int con(int a); 函数返回值是一个临时变量,没必要加const修饰(返回值为常量)
- 返回值为指针,const修饰函数返回值,返回的变量不能修改,接收返回值变量的类型也必须是带有const类型的相同变量来接收。
const char* con(); //一个返回值为const指针类型的函数
// 接收函数值的操作
char* str = con(); //错误
const char* str = con(); //正确
- const类型的成员函数
- const对象只能访问const成员函数,非const对象可以访问任何成员函数(包括const成员函数)
- const成员函数可以访问所有成员变量,但是只能访问const的成员函数
- 非const成员函数可以访问所有成员变量,也能访问所有成员函数,包括const的成员函数
- const成员函数不能修改任何的成员变量,除非变量用mutable修饰
顶层const与地城const
- 顶层const:对象本身是const类型:
int* const
,const int
- 底层const:对象本身不是一个const类型:
const int *
函数传参时,顶层const会被忽略:传参const int
会被忽略,改为const int*
,即可成功。 - 顶层const指的是const修饰的对象存储值不可修改的,但是指针指向地址是可以修改。
const int a = 10; // a是顶层const
int* p = &a; // 错误,不能将const int*转换为int*
const int* p = &a; // 正确,p是指向const int的指针,可以指向a
*p = 20; // 错误,a是const int类型,不可修改
p = nullptr; // 正确,p本身不是const,可以修改
- 底层const指的是const修饰的指针指向的地址是不可修改的,但是指针存储的值可以修改
int a = 10;
int b = 20;
int* const p = &a; // p是底层const,指向a,不可修改
*p = 30; // 正确,a的值被修改为30
p = &b; // 错误,p是const指针,不可修改
static
static 变量在程序初始化时被分配,直到程序退出前才被释放;也就是 static 是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。
修饰普通变量
是变量存储在静态区,在main函数运行之前,就已经对static变量进行了内存的分配
修饰全局变量
全局变量:定义在头文件下面,但是没有放在主函数或其他函数里面的变量。
如果static修饰全局变量,会把全局变量私有化,那么该变量只能在定义该变量的.cpp文件中调用该变量,其他文件是调用不了。
修饰普通函数
static修饰了该函数,那么也将和修饰全局变量一样,把这个函数私有化,只能在定义该函数的文件中定义该变量。表明该函数只在定义该函数的.cpp文件内才能使用该函数,
修饰成员变量,
被static修饰的成员变量,即使我们声明了多个类的实体,但是被static修饰的变量也只会保存一次,多个实例共同使用一个static变量,
修饰成员函数
和修饰成员变量想用,static修饰的成员变量和成员函数是跟着类走的,而不是跟着实例化对象走的。
static修饰的成员函数只能访问static成员变量,不能访问普通成员变量。