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就不能再指向其他变量
- 常对象:
- 它的数据成员值在对象的整个生存期间内不能被改变(常对象必须进行初始化,而且不能被更新)
- 语法形式: const 类型说明符 对象名;
- 用 const 修饰的类成员:
- 声明格式:类型说明符 函数名 (参数表) const;
注意:
- const 函数类型的一个组成部分, 因此函数定义部分也要带const关键字
- 一个对象声明为常对象,通过常对象只能调用它的常成员函数,而不能调用其他成员函数(c++语法机制对常对象的保护,也是常对象的唯一对外接口方式)
- 无论是否常对象调用常成员函数,在常成员函数调用期间,目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有用const修饰的成员函数(这就保证了常成员函数不会更改目的对象的数据成员的值)
- const 关键字可以用于对重载函数的区分
习惯:
在适当的地方使用 const 关键字,是能够提高程序质量的一个好习惯。对于无需改变对象状态的成员函数,都应当使用 const
常数据成员:
- 如果一个类中说明了常数据成员, 那么任何函数都不能对该成员赋值
- 构造函数对该成员初始化, 只能通过初始化列表 eg: A : : A ( int i ) : a(i){} A:类 a : 常数据成员
- 类的静态常量如果具有整数类型或枚举类型,那么可以直接在类的定义中为它指定常量值 eg: static const int b = 10; b : 静态常量
常引用:声明引用时用const修饰
- 常引用所引用的对象不能被更新(如果常引用作形参,便不会意外地发生对实参的改变)
- 声明形式: const 类型说明符 & 引用名;
- 对于基本类型的常引用,则不能为数据赋值
- 对于类类型的常引用,则不能修改它的数据成员,也不能调用它的非const的成员函数
常引用适用情况:
- 在函数中无需改变其值的参数(避免常对象无法被传入:因为普通引用不能绑定到常对象,常引用才能绑定到常对象)
- 对于大对象来说,传值耗时较多,因此传递常引用为宜
- 复制构造函数的参数一般也宜采用常引用传递
static:
- static用于全局变量,是说明全局变量只对定义在同一文件中的函数可见。 即使在另一个文件中使用了extern,另一个文件中的函数也不能访问这个全局变量。
- static用于一个函数, 说明该函数只能在同一个文件中调用
- static用于函数的局部变量。 它表明该变量的值不会因为函数终止而消失,它会被保存下来。再次调用该函数时,这个保存下来的值会用来初始化该变量。
- 用于类的成员变量。 它表明对类的所有对象,这个数据成员都只有一个实例。这个实例被所有对象共有。static的成员变量可以是private、public、protected的。定义和访问的语法也和其他数据成员一样
- 静态数据成员在类规格说明外部被初始化,这一点和全局变量相似。但是全局变量可以被隐式地初始化为0,而静态成员变量作为类的数据成员,必须被显式地初始化,因为类的所有的数据成员都必须被显式初始化。赋值和初始化存在着重要的区别,如果类型名后紧跟着变量名,就是初始化,如果变量名前没有类型名,就是赋值。初始化对于公共的和非公共的静态数据成员是合法的,但是对非公共的静态数据成员进行赋值却是不合法的。比如,如果count是private的,那么Point::count = 0就是错误的。
- static的第五种含义是用在类的成员函数前,表明这个函数不访问非静态数据成员,它只能访问它的参数、类的静态数据成员、全局变量。注意到静态成员函数访问的三种类型的数据,都不是描述对象状态的。而在函数参数列表后面使用const表明该函数不会修改该函数的目标对象的数据成员。所以,一个静态成员函数没有必要在参数列表之后添加一个const。
静态成员函数可以通过对象来调用,也可以直接使用类名来调用。因为它是类的特性,而不是对象的性质。
定义类的某个数据成员为静态变量,以表明此全局数据逻辑上属于该类。定义类的成员函数为静态函数,表明此全局函数逻辑上属于该类,而该函数只对静态数据、全局数据、参数进行操作。