const与static

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类型的成员函数
    1. const对象只能访问const成员函数非const对象可以访问任何成员函数(包括const成员函数)
    2. const成员函数可以访问所有成员变量,但是只能访问const的成员函数
    3. 非const成员函数可以访问所有成员变量,也能访问所有成员函数,包括const的成员函数
    4. const成员函数不能修改任何的成员变量,除非变量用mutable修饰

顶层const与地城const

  • 顶层const:对象本身是const类型: int* constconst 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成员变量,不能访问普通成员变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值