这篇文章是我看Siki学院学习的笔记,学习的地址如下:
http://www.sikiedu.com/my/course/518
因本人才疏学浅,如有错误之处,还请见谅
Const形参和实参
顶层const:表示任意的对象是常量
底层const:与指针和引用等复合类型有关
对指针而言,顶层const表示指针本身是个常量,而底层const表示指针所指的对象是一个常量。
PS:指针类型,既可以是顶层const也可以是底层const.
基础知识
#include<iostream>
using namespace std;
int main(void) {
//定义两个int
//num1就是普通int num2是int类型的常量
int num1 = 20;
const int num2 = 10;
int* p1 = &num1;
//错误,应为num2是常量,p2不可以修改num2的值
//int* p2 = &num2;
//底层的const,可以修改指针p2,p3指向的对象,但是不能
//通过p2,p3来修改它们指向的对象的值
const int* p2 = &num1;
const int* p3 = &num2;
//顶层的const,不可以修改p5指向的对象,但是可以通过
//p5来修改num1的值
int* const p5 = &num1;
//int* const p6 = &num2;
int &r1 = num1;
//int &r2 = num2;
//const int类型的引用,不能修改r3,r4的值
//可以使用int类型和const int类型的初始化
const int& r3 = num1;
const int& r4 = num2;
return 0;
}
在函数里面的应用
① 指针和普通形参
#include<iostream>
using namespace std;
int cube1(int i);
int cube2(const int i);
int pCube1(int* pi);
int pCube2(const int* pi);
int pCube3(int* const pi);
int main(void) {
int num1 = 20;
const int num2 = 10;
//实参是int或者const int都可以
//因为不管实参是什么,这个函数都只是用了一下它们的值
//可以修改形参i
cout << cube1(num1) << " " << cube1(num2) << endl;
//实参是int或者const int都可以
//因为不管实参是什么,这个函数都只是用了一下它们的值
//不可以修改
cout << cube2(num1) << " " << cube2(num2) << endl;
//num2会出错,因为*pi可能会修改num2的值,num2又是一个常量
//会引发冲突.
cout << pCube1(&num1) << endl;
cout << pCube2(&num1) <<" "<< pCube2(&num2) << endl;
cout << pCube3(&num1) << endl;
return 0;
}
int cube1(int i) {
i = 0;
return i * i * i;
}
int cube2(const int i) {
return i * i * i;
}
int pCube1(int* pi) {
return *pi * (*pi) * (*pi);
}
//可以修改pi的指向,但是不能通过pi修改pi指向的值
//可以是int也可以是const int
int pCube2(const int* pi) {
return *pi * (*pi) * (*pi);
}
//不能修改pi的指向,但是可以通过pi修改pi指向的值
//只能是int类型
int pCube3(int* const pi) {
*pi = 0; //这是可以的
//所以不能为const int类型
return *pi * (*pi) * (*pi);
}
② 引用
#include<iostream>
using namespace std;
int rCube1(int& r);
int rCube2(const int& r);
int main(void) {
int num1 = 20;
const int num2 = 10;
cout << rCube1(num1) << endl;
cout << rCube1(num1) << " " << rCube2(num2) << endl;
return 0;
}
//可以修改r,只能是int类型
int rCube1(int& r) {
return r * r * r;
}
//不能修改r,int和const类型都可以
int rCube2(const int& r) {
return r * r * r;
}
总结
① 指针和引用的话,就看形参能不能改变实参的值.如果可以改变,那么const就不行
② 没有用到指针和引用的话,就要注意不能改变const常量的值,还有变量的作用域和临时变量的存在
③ 具体问题,具体分析
如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗
相信我,你也能变成光.
如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.