目录
常引用和非常引用的转换(const T &和 T &是不同类型)
知识点
- const常量只是一个编译期间的常量。
- const全局变量存储在全局存储空间,而且是只读的,因此试图修改会出现段错误。
const作用
- 他可以保护变量,防止它们被无意的修改。
- 它可以传达有效的信息给读你代码的人:这个变量是不能被修改的,或者这个函数不会修该对象的成员,等。
const
关键字可以优化编译结果,让可执行程序更为紧凑。const
修饰的变量还可以写入 ROM 介质。
1. 基本注意事项
1)const 常量类型 常量名 = 常量表达式
const double PI=3.14;//常量、常指针、常函数
const char s[]="hello";//常数组
2) 常量是在程序执行过程中其值固定不变的内存单元的名字。在C++中常用const定义常量
注意事项
(1)必须在定义时进行初始化
#include <iostream>
using namespace std;
int main()
{
const int n;//错误,常量n未被初始化;
char *const p0;//错误,p0未被初始化;
const int i=5;//正确;
i=10;//错误,修改常量;
i++;//错误,修改常量;
return 0;
}
(2)C++中,表达式可以出现在常量定义语句中
#include <iostream>
using namespace std;
int main()
{
int j,k=9;
const int i1=10+k+6;//i1为25;
const int i2=j+10;//i2未知,因为j不确定,虽然这样是对的,但是没有意义;
return 0;
}
2. const出现的位置
-
引用中出现const
int x=9;
const int &rx=x;//常引用x的值是可以改变的,但是rx引用是不能改变的,虽然改变x的值的同时改变了rx但是不能直接通过改变rx来改变其自身的值;
如
#include <iostream>
using namespace std;
int main()
{
int x=9;
const int &rx=x;
x=4;//rx=4错误
cout<<rx;
}
结果为 4
-
常引用和非常引用的转换(const T &和 T &是不同类型)
不能把常量指针赋值给非常量指针,但是可以通过强制类型转换来进行赋值
const int *p1;
int *p2;
p1=p2;//ok;
p2=p1;//error;
p2=(int *)p1;//ok,强制类型转换;
-
指针中出现const
(1)int *const p
int i=7,j=8;
int *const p=&i;//p是常指针不可变,i可变。所以p=&j是错误的;
如:
#include <iostream>
using namespace std;
int main()
{
int i=7,j=8;
int *const p=&i;
i=j;//p=&j错误;
cout<<*p;
}
结果为 8
(2)const int* p 等价 int const *p
int i=7,j=8;
int const *p=&i;//*p是指向常量的指针不可以改变,但是i可以变。*p不可以变,也就是说p值不可变;所以i=3是正确的;*p=4是错误的,因为改变了i的值
如:
#include <iostream>
using namespace std;
int main()
{
int i=7;
int const *p=&i;
i=3;//*p=4错误;
cout<<*p;
}
结果为 3
#include <iostream>
using namespace std;
int main()
{
int i=7,j=8;
int const *p=&i;
i=3;
p=&j;
cout<<*p;
}
结果为 8
(3)const int * const p
const int const *p;//p指向常量的常指针
-
函数中出现const
int f(int &px,const int &py);
int f(int x,const int y);
const int *f();//返回的常指针
*f()=2;//这样是错误的
const int &f();//返回的常引用;
void num(const char *p)//函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容;
-
函数后出现const
函数不会修改任何数据成员,实际上函数后的const修饰的是隐藏参数this指针,this是当前对象的指针,this被修饰成this表明对象的数据成员不能被修改。
3. const的合理使用
- const只修饰输入参数(非内部数据类型)
为了防止对输入参数进行修改,用const 修饰输入参数。
对于非内部数据类型的输入参数,将值传递改为引用传递可以提高效率。如void Func(A a) 改为 void Func(A &a)
对于非内部数据类型的输入参数,不要将值传递改为const引用传递,否则即达不到提高效率的目的,又降低了函数的可理解性。如void Func(int a) 改为 void Func(const int &a)
对于输出参数,用const修饰没有意义。
- const修饰函数的返回值(返回值采用值传递,加const没有意义)
加const的函数返回值只能被赋给加const修饰的同类型指针。如const char* GetString(void);
错误:char* str = GetString();
正确:const char* str = GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值
4. this指针的作用
http://c.biancheng.net/view/2226.html
参考:
https://blog.csdn.net/fighting123678/article/details/79487479
https://baijiahao.baidu.com/s?id=1619916909815372418&wfr=spider&for=pc
https://blog.csdn.net/wujunokay/article/details/90720808