1. 修饰变量

1.1 const变量与普通变量

1.1.1 const变量与普通变量的赋值合法情况

关键:没有差别,随意赋值

=左边是否const =右边是否const 是否合法
Y Y Y
Y N Y
N Y Y
N N Y
int i = 42;            //正确
const int j = i;    //正确
int k = j;            //正确
1.1.2 const变量与普通变量的2点区别
  1. 只读变量定义时,定义时必须初始化,且以后不能再更改其值
const int i = 42;            //正确
const int j = get_size(0);    //正确
const int k;                //错误:定义时没有赋初值
i = 43;                        //错误:之后修改其值
  1. 有效范围默认情况下,const对象只在本文件中有效

如果想在文件间共享该const对象,必须在变量的定义之前添加extern关键字
文件间共享的cosnt变量与文件间共享的普通变量区别在于:定义时额外extern修饰

第一种:只在本文件中有效的const对象

//file_1.cpp定义并初始化了一个const对象,只能在该文件中有效
const int bufsize = gitsize();

第二种:在文件间共享的const对象

//file_1.cpp定义并初始化了一个const对象
extern const int bufsize = gitsize();
//file_1.h头文件中声明下
extern const int bufsize;//表明该对象已经定义了,可以在其他文件中共享

第三种:普通变量在文件间共享

//file_1.cpp定义并初始化了一个普通对象
int bufsize = gitsize();
//file_1.h头文件中声明下
extern int bufsize;//表明该对象已经定义了,可以在其他文件中共享

1.2 const与指针

1.2.1 const/指针/对象的合法情况

关键:对象是自私的A博爱,p咋的都行;A不博爱,p必须只爱A

A是否被const修饰 指针是否被const修饰 是否合法
Y Y Y
Y N Y
N Y Y
N N N
int a1 = 0;
const int ca1 = 0;
int *p1;    
const int *cp2;

p1 = &a1;        //Y
p1 = &ca1 ;        //N

cp2 = &a1;        //Y
cp2 = &ca1 ;    //Y
1.2.2 const/指针/对象的场景

关键:const离指针符号近修饰指针–该指针只能指向该对象,不可以更改指向其他对象;离类型近修饰该对象–该对象不可以被该指针修改,单有可能被其他指针修改(前提是该对象非const)

  1. const 类型 *p = A 不能通过p修改A,但p可以指向B
A是否被const修饰 是否可通过p修改A 是否可通过其他指针修改A
Y N N
N N Y
  1. 类型 const *p = A p可以指向A也可以指向B*
A是否被const修饰 是否可通过p修改A 是否可通过其他指针修改A
Y N N
N Y Y
  1. const 类型 const *p = A 不能通过p修改A,p只能指向A
A是否被const修饰 是否可通过p修改A 是否可通过其他指针修改A
Y N N
N N Y
const double pi = 3.14;
double *ptr = π            //博爱的ptr不能指向不博爱的A
const double *cptr = π
*cptr = 42;                    //错误:即pi=42,因为pi是const的,不能被修改

1.3 const与引用

1.3.1 const/引用/对象的合法情况

关键:与指针的情况一样

A是否被const修饰 引用是否被const修饰 是否合法
Y Y Y
Y N Y
N Y Y
N N N
1.2.2 const/指针/对象的场景

关键:因为引用已经是绑定了对象,不在绑定其他对象,相当于自带cosnt * p的情况。所以,结合指针,与指针的2、3两种情况一样

  1. 类型 &r = A
A是否被const修饰 是否可通过r修改A 是否可通过其他引用修改A
Y N N
N Y Y
  1. const 类型 &r = A
A是否被const修饰 是否可通过r修改A 是否可通过其他引用修改A
Y N N
N N Y

2. 修饰函数

2.1 例子

//