const是一个C++语言的限定符,使用const在一定程度上可以提高程序的安全性和可靠性。
下面是const的11种常见用法:
1. 修饰常量
用const修饰的变量是不可变的。
const int x = 1; //等价于int const x = 1;
2. 修饰指针
const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
int a = 1;
const int* p = &a; // p指向的内容不能变
int const* p = &a; // p指向的内容不能变
int* const p = &a; // 指针本身p的值不能变,不能改变p的指向
const int* const p =&a; // 指针p为常量,且p指向一个常量
int const* const p =&a; // 同上
3. 修饰引用
int a = 1;
const int& b = a;
int const& b = a;
4. 修饰函数参数
被const修饰的函数参数,在函数内不可以改变其值。
void Func (const int a)
{
a = 0; //编译报错
}
5. 修饰函数返回值
用const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同。
const int* func() // 返回的指针所指向的内容不能修改
{
// return p;
}
6. 修饰类成员变量
用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。
class A
{
public:
A(int x) : a(x)
{
}
private:
const int a;
};
7. 修饰类成员函数
用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。
class A
{
public:
int& getValue() const
{
// a = 10; // 错误
return a;
}
private:
int a;// 非const成员变量
};
8. 修饰类对象
用const修饰的类对象,该对象内的任何成员变量都不能被修改。
因此不能调用该对象的任何非const成员函数,因为对非const成员函数的调用可能会修改成员变量的值。
class A
{
public:
void funcA() {}
void funcB() const {}
};
int main
{
const A a;
a.funcB();// 可以
a.funcA(); // 错误
}
9. 在类内重载成员函数
class A
{
public:
void func() {}
void func() const {} // 重载
};
10. const与宏定义的区别
const常量有数据类型,而宏常量没有数据类型。编译器对前者进行类型安全检查,对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
11. const_cast
对于这种标准转换运算符的用法可以参考下这篇文章:
http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html