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点区别
- 只读变量:定义时,定义时必须初始化,且以后不能再更改其值
const int i = 42; //正确
const int j = get_size(0); //正确
const int k; //错误:定义时没有赋初值
i = 43; //错误:之后修改其值
- 有效范围:默认情况下,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)
- const 类型 *p = A :不能通过p修改A,但p可以指向B
A是否被const修饰 | 是否可通过p修改A | 是否可通过其他指针修改A |
---|---|---|
Y | N | N |
N | N | Y |
- 类型 const *p = A :p可以指向A也可以指向B*
A是否被const修饰 | 是否可通过p修改A | 是否可通过其他指针修改A |
---|---|---|
Y | N | N |
N | Y | Y |
- 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两种情况一样
- 类型 &r = A :
A是否被const修饰 | 是否可通过r修改A | 是否可通过其他引用修改A |
---|---|---|
Y | N | N |
N | Y | Y |
- const 类型 &r = A :
A是否被const修饰 | 是否可通过r修改A | 是否可通过其他引用修改A |
---|---|---|
Y | N | N |
N | N | Y |
2. 修饰函数
2.1 例子
//