一、const常见用法
常变量: const int 变量名(变量值不可改变)
常引用: const int &引用名(int &a=b 相当于 int *const a=b,所以引用必须初始化,const int&a=b 相当于 const int *const a=b,指向内容和指针都不可变)
常对象: 类名 const 对象名 或 const 类名 对象名
常数组: const 类型标识符 数组名[大小] 或 类型标识符 const 数组名[大小]
常成员函数:<类型标识符> 类名::fun(形参) const
常量指针、指针常量:const 类型说明符* 指针名 ,类型说明符* const 指针名
指向常量的指针:const 类型标识符* const 指针名
二、const的作用
cosnt保证数据在它的生存期内不会被改变。
1、定义变量(局部变量或全局变量)为常量
const int N=100;//定义一个常量N
N=50; //错误,常量的值不能被修改
const int n; //错误,常量在定义的时候必须初始化
2、修饰函数的参数(传地址、引用时)
表示函数体内不能修改这个变量,只能用,不能变。
3、修饰函数的返回值
a、const修饰普通类型的返回值(如int、float等)
由于返回值是一个临时变量,函数调用结束后临时变量的生命周期也就结束了,因此将这些返回值修饰为const类型是没有意义的。(如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值,详见c++中不能返回临时变量的引用或者指针的问题)
b、const修饰指针类型的返回值
若函数的返回值是指针,且用const修饰,则函数返回值指向的内容是常数,不可被修改,此返回值仅能赋值给const修饰的相同类型的指针。
const int test() //定义一个函数
char *a= test() //错误,因为str没有被 const修饰
const int *a=test() //正确
4、节省空间,避免不必要的内存分配(具体含义请理解下代码)
#define M 3 //宏常量
const int N = 5; //此时并未将N放入内存中
int main()
{
int i = N; //此时为N分配内存 ,以后不再为N分配
int I = M; //预编译期间进行宏替换,分配内存
int j = N; //没有为N进行内存分配
int J = M; //在进行宏替换,又一次分配内存
}
三、使用const的情况
1、常变量
int const x=2;const int x=2; // 没有区别
2、常数组
// 作用相同
int const a[8]={1,2,3,4,5,6,7,8}
const int a[8]={1,2,3,4,5,6,7,8}
3、常对象
class A:
const A a:
A const a:
一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。
4、常指针
const int*p; //常量指针,指向常量的指针。即p指向的内存可以变,p指向的数值内容不可变
int const*p; //同上
int*const p;//指针常量,本质是一个常量,而用指针修饰它。 即p指向的内存不可以变,但是p内
存位置的数值可以变
const int* const p;//指向常量的常量指针。即p指向的内存和数值都不可变
5、常引用
const int &a = b;
首先进一步理解引用: int &a=b 相当于 int *const a=b。const int &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。
6、修饰函数的参数
void Fun(const int Var)
告诉编译器Var在函数体中不能被改变,从而防止了使用者一些无意的或错误的修改,一般在传入的参数是指针类型或者引用类型时常用const修饰, 防止函数改变其值。
7、修饰函数的返回值
上面已经详细讲过。
8、在另一连接文件中引用const变量
extern const int j=10;
四、const 和非 const 类型转换
简单来说就是,const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。char *指向的数据有读取和写入权限,而const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。
#include <stdio.h>
void func(char *str){ }
int main(){
const char *str1 = "c.biancheng.net";
char *str2 = str1;
func(str1);
return 0;
}
上面的代码中直接将 const 类型的数据交给了非 const 类型的变量,编译器不会容忍这种行为,会给出警告,甚至直接报错。