一.要以const,enum,inline来尽可能的代替#define
我们无法利用#define 创建一个class专属的常量,因为define并不重视作用域,也不能提供封装性
对于单纯变量,最好是以const对象或者enums来代替#define
对于形似函数的宏,最好使用inline函数来代替#define
定义常量指针,由于常量定义是通常被放在头文件内,因此有必要将指针声明为const ,如果要在头文件内定义一个常量的不变的 char* based字符串,在这种情况之中必须写两次const:
const char * const name = "Scott";
第二次需要注意的是class专属变量,为了将常量的作用域限制与class之中,那么必须让它成为一个class成员,确保此变量至多有一个实体,确保此常量至多只有一个实体,必须让他成为一个static成员
class A
{
private:
static const int n = 5;//声明式
}
C++中要求对你使用的所有的任意东西提供一个定义式,但是如果它是一个class中的专属变量又是static且为整数,只要不取他们的地址,无需提供一个定义式,另外需要提供一个定义式
const int A::n=5;
二.尽可能使用const
const允许指定一个语意的约束(也就是指定一个"不该被改动"的对象),const可以修饰在任意的地方之中,class之中,文件,函数,区块作用域之中,也可以使用他修饰classes内部中的成员变量.
STL迭代器以指针为根据塑模出来,所以迭代器的作用就像一个T*指针.
STL迭代器中的 const .... iterator 中的iter的作用像个T * const
eg :
vector< int > vec;
```
const vector<int>::iterator iter = vec.begin();
*iter = 10;//没问题
iter++;//错误
… const_iterator 中的iter的作用像个 const *T
vector< int >::const_iterator CIter = vec.begin();//CIter的作用是const T*
*Clter = 10; //错误,*Clter是const
++Clter;
const最具威力的用法是面对函数声明时候的应用,而又不至于放弃安全性和高效性
const h operator*(const h &lhs,const h &rhs);
返回const对象是为了防止一些错误内容
h a,b,c;
(a*b) = c;
const 函数实施于成员函数
的目的是,为了确认该成员函数作用于const 对象身上,
基于两个理由:
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变
一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
非const成员函数不能访问const类对象的数据成员
(2) bitwise const和logical constness
bitwise const 阵营的人,成员函数只有在不更改对象的任何成员变量的时候才可以说是const,但是不幸的是,很多成员函数不是const性质,但是却可以通过bitwise测试,如果只有指针属于对象,那么称此函数为bitwise const 不会引发编译器错误.
logical constness主张,一个const成员函数可以修改它所处理的某些bits,但只有在客户端检测不出的情况下才可以如此
class A{
public:
size_t length() const;
private:
char * pText;
size_t textLength;
bool lengthIsValid;
};
size_t A::length() const
{
textLength = 0 ;// 错误,在const成员函数内不能赋值
}
解决办法
:本质上,const指针修饰的是被隐藏的this指针所指向的内存空间,修饰的是this指针。
可以使用mutable
可变的来消除const的约束