一. const
的基本功能与用法
1.将限定符声明为只读
使用方法如下,在类型前/后加上关键字const
,该变量必须被初始化,否则编译错误;该变量不能被重新赋值,否则也编译错误。
举例:
const int i = 50; // 编译正确
const int j; // 编译错误
int k = 0;
i = k; // 编译错误
k = i; // 编译正确
2.用于修饰函数形参,保护参数使其不被修改
用法1:若形参为const A* a
,则不能改变函数所传递的指针内容,这样对指针所指向的内容起到保护作用,这里需要注意的是,该修饰不能改变指针所指向地址所存储的内容,但是指针a
所指向的地址可以被改变,具体例子如下:
void Test(const int *a)
{
*a = 1; //错误,*a不能被赋值
a = new int(10086); //正确,为指针a开辟新的空间,并令*a=10086
}
int main()
{
int *a = new int(10000);
Test(a);
return 0;
}
用法2:若形参为const A& a
,则不能改变函数传递进来的引用对象,从而保护了原对象的属性。
对于自定义的数据类型,用引用传递速度较快,如果不想改变原值,就可以用const
来保护参数,如以下例子:
void Test(const int &a) //保护L7中的a不会被改变
{
a = 2;//错误,a不能给常量赋值
}
int main()
{
int a = 3;
Test(a);
return 0;
}
事实上对于内置型数据类型(如以上例子中的int
类型),用引用传递不会使速度更快。如果是用引用传参,一般是为了改变参数值;如果不想改变参数的值,直接值传递即可,不必使用const
修饰。而对于自定义数据类型的输入参数,为了提高速度和效率,应使用“const
+ 引用传递”代替值传递。例如:
将函数 void Test(A a)
改为-> void Test(const A &a)
3.用于修饰函数返回值
用法1:用const
修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候
举例:
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
Rational a,b;
Radi