关于指针和const:
1.指向const对象的指针(指针本身不是const的)
const double *ptr;
<1>这个指针本身不是const的,在定义时不需要对它进行初始化;
<2>cptr可以重新赋值,让它指向另外一个const对象;
<3>const对象的地址不能传给非const对象的指针,否则可以通过那个指针来修改,丧失const作用。
<4>非const对象的地址可以传给指向const对象的指针(并且这个指针永远认为自己指向的是const对象)
<5>指向const对象的指针不允许通过它来改变所指对象的值。(但是如果实际上它所指的对象是一个非const对象的话,可以通过其他方法来修改所指对象的值。)
指向const对象指针的特点就是:它认为自己指向的是const对象,并且负责任地不让通过它来修改所指对象。
2.真正的const指针(这个指针本身是const的)
double *const ptr;
<1>它所指的对象不能变,一开始指向谁就一直指向谁。指向了A就不能指向B。
<2>如果它所指的对象不是const的,那么可以通过ptr来修改对象的值。
真正的const指针的特点就是:你可以改我的对象,但是我就只指向我的对象。
3.指向const对象的const指针(以上两者的结合)
const double *const ptr;
关于引用和const
1.const引用:指向const对象的引用,不能通过这个引用来改变它所指的对象。
2.非const的引用不能绑定到const的对象上,否则就可以通过这个引用来改变const对象了。
const T cref;
T &ref = cref ;//error
3.const引用可以绑定到const对象,非const对象和右值。
绑定到const对象很好理解。
绑定到非const对象的例子:
T value = ...;
const T &ref = value;
没有问题。编译器会生成一个中间变量temp,T temp = value,ref = temp;
这样,如果修改ref,只能修改temp的值,而不会修改value;
const引用(指向const对象的引用)和指向const对象的指针有相似之处:
它们都认为自己指向的是一个const对象(其实可能不是),因此负责地不让通过自己来改变所指对象。
实际上,引用本身就很有const指针的性质:一旦指定,就不可以更改所指对象。我怀疑在编译时引用本来就会被转化成const指针的。
函数形参中的const
1.传值时的const
如果是在传值的情况下,const在保护原对象上是没有意义的,因为本来就是传一个副本到函数中。这时候const所起的作用是保护这个参数在函数中不被修改(比如某个不可以改的参数)。
2.传引用时的const
如果函数声明为非const对象的引用,那么不可以给它传递一个const的引用。否则函数内部可以修改对象,显然与const冲突。
如果函数声明为const对象,那么可以给它传递const和非const的引用。这里似乎涉及到非const和const之间一个转换的问题。此时的对象是不允许修改的。
3.传指针时的const
与传引用时一样。
4.关于重载
在传值和传指针时,有const和没有const不能算作重载。
在传引用时,有const和没有const视为重载。
5.类中的const成员函数不能修改所操作的对象的数据成员。
6.类的构造函数不能声明为const。
你是知道常量定义么几个例子:const int a=1;const char a='a';const bool a=true;...这是我面前知道的C++常量定义,不好意思,刚学,只知道这些
const是用来定义常量的,对于普通的变量是比较好理解的,但在指针方面及类定义中要小心使用。
const是只读修饰符,定义了变量的只读属性!