const关键字、volatile关键字、static关键字、define

const的作用

  • const修饰一个变量,可以使得这个变量的值不能被改变。因为const对象一旦创建后,其值就不能再改变,所以const对象必须实例化。
  • const可以修饰指针,可以指定指针自己为const(常量指针),也可以指定指针所指向的数据为const(指向常量的指针),或者二者同时指定为const。
  • const可以修饰函数的形参,表明它是一个输入参数,在函数内部不能改变其值。
  • const可以修饰类的成员函数,则表明它是一个常函数,++不能修改类的成员变量。++
    • 子问题:const 修饰类的成员函数是什么意思?
      • 回答: const修饰类成员函数,实际修饰该成员函数隐含的this指针所指向的内存空间,++修饰的是this指针++。表明在该成员函数中不能对类的任何成员进行修改。(在函数后加 const即可)
class Date
{
public:
    void GetDay(void);
private:
    int m_year;
    int m_month;
    int m_day;
};
 
void GetDay(void) const  // const修饰类的成员函数
{
    return m_day;
}

//mutable 是为了突破 const的限制而设置的,可以用来修饰一个类的成员变量。
//被 mutable 修饰的变量,将永远处于可变的状态,即使是 const 函数中也可以改变这个变量的值。
class Date
{
public:
    void GetDay(void);
private:
    mutable int m_year; //mutable修饰m_year
    int m_month;
    int m_day;
};
 
void GetDay(void) const
{
    m_year = 2018; // 
    return m_day;
}

volatile关键字

与const的作用相反。它也是用来修饰变量的,但是是用于告诉编译器该变量值是不稳定的,可能被更改。

  • 编译器会对带有volatile关键字的变量禁用优化,防止编译器优化把变量从内存装入CPU寄存器中。
  • 当多个线程都要用到某一个变量且该变量的值会被改变时应该用volatile声明,该关键字的作用是防止编译器优化把变量从内存装入CPU寄存器中。如果变量被装入寄存器,那么多个线程中,可能有的使用内存中的变量,有的使用寄存器中的变量,这会造成程序的错误执行。volatile的意思是让编译器每次操作该变量时一定要从内存中取出,而不是使用已经存在寄存器中的值,防止程序的错误执行 。

const调用时需要注意的地方

  1. const对象可以调用非const成员函数吗?
    • 回答:不可以
  2. 非const对象可以调用const成员函数吗?
    • 可以

普通对象可以调用任意类型的成员函数。而const对象只可以调用const类型的成员函数。

  1. const成员函数内可以调用其他的非const成员函数吗?
    • 不可以
  2. 非const成员函数可以调用其他的const成员函数吗?
    • 可以

普通类型的函数可以调用任意类型的成员函数,而const类型的成员函数只能调用const类型的成员函数。

总结:const对象和const类型的成员函数都只能调用const类型的成员函数。

const和define的区别?

  1. 编译器处理方式
  • define —— 在预处理阶段进行替换
  • const —— 在编译时确定其值
  1. 类型检查
  • define —— 无类型,不进行类型安全检查,可能会产生意想不到的错误
  • const —— 有数据类型,编译时会进行类型检查
  1. 内存空间
  • define —— 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大
  • const —— 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝

在c++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

static的作用

  1. 修饰全局变量 —— 全局静态变量
    • 内存中的位置:静态存储区,在整个程序运行期间一直存在
    • 作用域:从定义之处开始,到文件结尾。
  2. 修饰局部变量 —— 局部静态变量
    • 内存中的位置:静态存储区
    • 作用域:为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有被销毁,而是仍然驻留在内存中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。
    • 作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
  3. 修饰函数 —— 静态函数
    • 作用域:被static修饰的函数只可以在本cpp文件内使用。
  4. 修饰类的成员变量 —— 类的静态成员
    • 在类中,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,类中的静态成员变量只存储一处,供所有对象使用。
    • 属于类的,不属于对象,访问方式为:<类名>::<静态成员>
  5. 修饰类的成员函数 —— 类的静态函数
    • 静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要使用对象名。<类名>::<静态成员函数名>(<参数表>);
    • 在静态成员的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数非要引用静态成员,可通过对象来引用。(该函数不接收this指针)

const和static的区别?

  • const定义的常量在超出其作用域之后其空间会被释放;static定义的静态常量在函数执行后不会释放其存储空间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值