const 和 static 剖析

const:
  • const+变量类型名:表明这个变量的值是保持不变的,该变量必须在定义时初始化,初始化后对其进行任何赋值都是非法的。
  • 当指针或引用指向一个常量时,必须在类型名前使用const标识这个指针或者引用指向的“变量”为常量,没有的话就是语法错误 如: const int x = 5; const int* px = &x; const int& rx = x;这样一来,直接修改x是不可能的,通过*px或者rx修改x也是不可能的。当然,这个指针还能指向其他的地方,因为指针本身并没有被标识为const的。比如,px = &y;
  • 如果想让一个指针本身成为const的,就要在*后加const,即int* const p = &x;这个时候,p就不能再指向其他变量

  • 常对象:
  1. 它的数据成员值在对象的整个生存期间内不能被改变(常对象必须进行初始化,而且不能被更新)
  2. 语法形式: const  类型说明符   对象名;
  • 用 const 修饰的类成员:
常成员函数
  1. 声明格式:类型说明符  函数名  (参数表) const
注意:
  1. const  函数类型的一个组成部分, 因此函数定义部分也要带const关键字
  2. 一个对象声明为常对象,通过常对象只能调用它的常成员函数,而不能调用其他成员函数(c++语法机制对常对象的保护,也是常对象的唯一对外接口方式)
  3. 无论是否常对象调用常成员函数,在常成员函数调用期间,目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员也不能针对目的对象调用该类中没有用const修饰的成员函数这就保证了常成员函数不会更改目的对象的数据成员的值
  4. const 关键字可以用于对重载函数的区分
习惯:

          在适当的地方使用 const 关键字,是能够提高程序质量的一个好习惯。对于无需改变对象状态的成员函数,都应当使用 const

常数据成员
  1. 如果一个类中说明了常数据成员, 那么任何函数都不能对该成员赋值
  2. 构造函数对该成员初始化, 只能通过初始化列表    eg: A : : A ( int i ) : a(i){}       A:类        a : 常数据成员 
  3. 类的静态常量如果具有整数类型或枚举类型,那么可以直接在类的定义中为它指定常量值      eg: static  const  int  b =  10;     b : 静态常量


常引用:声明引用时用const修饰
  1. 常引用所引用的对象不能被更新(如果常引用作形参,便不会意外地发生对实参的改变
  2. 声明形式: const 类型说明符  & 引用名;
  3. 对于基本类型的常引用,则不能为数据赋值
  4. 对于类类型的常引用,则不能修改它的数据成员,也不能调用它的非const的成员函数

常引用适用情况:
  1. 在函数中无需改变其值的参数(避免常对象无法被传入:因为普通引用不能绑定到常对象,常引用才能绑定到常对象)
  2. 对于大对象来说,传值耗时较多,因此传递常引用为宜
  3. 复制构造函数的参数一般也宜采用常引用传递



static:
  • static用于全局变量,是说明全局变量只对定义在同一文件中的函数可见。 即使在另一个文件中使用了extern,另一个文件中的函数也不能访问这个全局变量。
  • static用于一个函数, 说明该函数只能在同一个文件中调用
  • static用于函数的局部变量。 它表明该变量的值不会因为函数终止而消失,它会被保存下来。再次调用该函数时,这个保存下来的值会用来初始化该变量。
  • 用于的成员变量。 它表明对类的所有对象,这个数据成员都只有一个实例。这个实例被所有对象共有。static的成员变量可以是private、public、protected的。定义和访问的语法也和其他数据成员一样
  • 静态数据成员在类规格说明外部被初始化,这一点和全局变量相似。但是全局变量可以被隐式地初始化为0,而静态成员变量作为类的数据成员,必须被显式地初始化,因为类的所有的数据成员都必须被显式初始化。赋值和初始化存在着重要的区别,如果类型名后紧跟着变量名,就是初始化,如果变量名前没有类型名,就是赋值。初始化对于公共的和非公共的静态数据成员是合法的,但是对非公共的静态数据成员进行赋值却是不合法的。比如,如果count是private的,那么Point::count = 0就是错误的。
  • static的第五种含义是用在类的成员函数前,表明这个函数不访问非静态数据成员,它只能访问它的参数、类的静态数据成员、全局变量。注意到静态成员函数访问的三种类型的数据,都不是描述对象状态的。而在函数参数列表后面使用const表明该函数不会修改该函数的目标对象的数据成员。所以,一个静态成员函数没有必要在参数列表之后添加一个const。
    静态成员函数可以通过对象来调用,也可以直接使用类名来调用。因为它是类的特性,而不是对象的性质。
    定义类的某个数据成员为静态变量,以表明此全局数据逻辑上属于该类。定义类的成员函数为静态函数,表明此全局函数逻辑上属于该类,而该函数只对静态数据、全局数据、参数进行操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值