修饰变量
const int a = 2048;// a不能改变值
修饰指针* 或者引用&
/* const 在 * 前面 ,则认为其修饰的是 *p 这个整体*/
const int * p = &a;//不允许修改*p ,但是可以修改p指向的对象,a本身也可以修改
int const * p = &a;//同上
/* const 在 * 后面 ,则认为其修饰的是 p 这个指针*/
int * const p = &a;//允许修改*p , 但是不能修改p指向的对象,a本身可以修改
/*对于引用 & 对const的位置不敏感(引用本身定义好后,不用 const 也不能变化)*/
const int & z = a;//因为引用本质是同一个东西,所以都是不能变化
int const & z = a;//同上
用在函数中
/*在参数中使用const*/
int main(const int * a,const Stock & b){
return 0;
}
//如果没有参数可以选择在()后面加const
int fun() cosnt {
}
//若函数不修改原来的变量的值,最好使用const修饰确保函数中不会对原来的引用或者指针造成修改
//此时若有一个数组
const int a [3] ={1,4,5};
//函数声明
void ( int * nums){}
//或者
void ( int nums[]){}
//都不可以输入a数组,因为a数组输入时是作为const指针,实际行为是想将const指针赋值给非const变量,这样就会引起权限错误,因为逻辑上造成了:可以用非const的指针去修改一个const变量。
//一般是为了防止运算符重载等二元运算赋值时出现 v1+v2 =v3; 的无效语句
class Stock{
int val;
public:
/*在声明中修饰返回值*/
const Stock operator+(Stock & b){
Stock z;
z.val =this.val + b.val
return z;}//注意此时不能在函数返回处声明为 & 引用,因为此时返回的是临时变量,如果不直接返回副本,则会导致运行完后临时变量消失,返回的引用也消失。
}
在类中使用const
dad类只能通过构造函数初始化,在类的定义中只能声明类型,产生了const 和 & 的问题。
注意:只有构造函数可以使用这种 成员初始化列表的语法(解决const 和 & 这种需要定义声明同步进行的类型)
//因为类在声明的时候不进行初始化,创造实例是才会初始化,此时如果在变量中有一个const类型,同时声明+初始化是可以的,但是想先声明再初始化,需要借助构造函数的成员初始化表结构,想用传统的构造函数中赋值初始化是不允许的,这违反了 const 值不可以修改的原则。
//成员初始化列表是保证了顺序 运行初始化列表赋值 -> 运行构造函数
class Stock{
private:
const int b;//只声明,需要创建实例时的参数来初始化
short & c;//引用同上规则
long d;//普通变量
public:
Stock(int in_b, short in_c,long in_d):b(in_b),c(in_c),d(in_d){
}
}