c++ const用法
一、 基本用法概念
char greeting[] = "Hello";
char* p = greeting; // non-const pointer, non-const data
const char* p = greeting; (char const *p = greeting ; char 和const 的位置可以变换)// non-const pointer, const data
char* const p = greeting; // const pointer, non-const data
const char* const p = greeting; // const pointer, const data
如果const 在星号左边,则表示被指物是常量;如果const在星号右边,则表示指针自身是常量; 如果两边都有,则表示被指物和指针自身都是常量。
二、 STL中const的应用
在STL中,声明一个迭代器为const 相当于声明指针为const一样,即一个T* const指针; 如果希望迭代器所指的内容不可以被改变,即const T*指针的效果,则应该使用const_iterator:
std::vector<int> vec;
...
const std::vector<int>::iterator iter = vec.begin(); // T* const类型的iter
*iter = 10; // 正确
iter++; // 错误
std::vector<int>::const_iterator CIter = vec.begin(); // const T* 类型的iter
*CIter = 10; // 错误
CIter++; // 正确
三、 const在函数声明时的使用
在一个函数声明式中,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。
class Rational { ... };
const Rational operator* (const Rational& lhs, const Rational& rhs);
声明返回值为const,可避免下面的操作:
Ratioinal a, b,c;
...
(a * b) = c; // 不允许
if ( a * b = c ) // 不允许,避免了==写成了= 的错误
const成员函数
将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。这一类成员函数之所以重要,基于两个理由。第一,它们使class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很是重要。第二,它们使“操作const对象”成为可能。这对于编写高效代码是个关键,因为改变c++程序效率的一个根本方法就是以传递引用的方式来传递对象,而这个的前提就是我们有const成员函数可以用来处理取得(并经修饰而成)的const对象。
在const成员函数中不允许对non-static成员变量进行赋值。使用mutable修饰成员变量,可以在const成员函数中更改他们:
class XXXX
{
public:
mutable bool IsLarger; // 可在const成员函数中进行更改
int args; // 不可在const成员函数中进行更改
....
void DoSomething() const
{
...
IsLarget = true; // 正确
args = 3; // 错误
..
}
...
};
常量性消除(casting away constess),将返回结果去常量化:
class TextBlock
{
public:
char& operator[](std::size_t pos ) const { ... ; return text[pos];} // const 成员函数
char& operator[](std::size_t pos ) // non-const 成员函数
{
return const_cast<char&> // 将op[]返回值的const移除
(static_cast<const TextBlock&>(*this)[pos]); // 为*this加上const性质,并调用上面的const op[]
}
private:
std::string text;
};
四、尽可能使用const
1 将某些东西声明为const可帮助编译器真测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体
2 编译器强制实施bitwise constess, 但你编写程序时应该使用“概念上的常量性”
3 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

浙公网安备 33010602011771号