1. const 放在函数的后面 (一般修饰成员函数)
在普通的非const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const的成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变const指向的对象,也不能改变this所保存的地址。
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数是,不慎修改了数据成员,或者调用了其他非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
注意 :const成员函数只能访问const类型的成员函数 , 而非const对象可以访问任意的成员函数,包括const成员函数.
2. const 放在前面 修饰函数返回值 (一般用于地址返回)
如果给以 “指针传递” 方式的函数返回值 加const修饰,那么函数返回值(即指针的内容不能被修改),该返回值只能被赋值给加 const修饰的同类型指针。
例如: const char * getstring();
char* str = getstring(); 这样是错误的
const char* str = getstring(); 这样是正确的
3. const 放在中间 修饰函数的参数
如果输入参数采用 “指针传递” ,那么加const修饰可以防止意外的改动该指针,起到保护作用;
对于非内置类型(即自定义类类型),采用值传递时,我们可以采用引用传递,这样可以提高传递效率(避免了构造、析构等操作),但是对于内置类型就没有必要了,然后此时如果我们希望引用传递进来的参数,不要被改变时,加const 进行修饰即可。
例如: void function(const A &input){} (其中A是自定义类)
PS:
1. 指向常量的指针
仅仅要求不能通过改该指针改变对象的值,没有规定那个对象的值不能通过其他途径改变!
指向常量的指针 定义 以后可以不断改变指向的对象 ;
例如: const char * k = new char;
char a= 5, b= 6;
k = &a; // 此时不能通过就解引用k *k 来改变a的值 ,但是可以直接用变量a自己改变自己的值
k = &b; // 定义后改变k指向的对象 这是允许的
2. const 指针 (常量指针)
先说个例子: 类内的 this 指针就是一个常量指针 。( A * const this )
将指针本身定义为常量,也就是它的地址,定义时必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中 的那个地址)就不能改变了 ,但是可以解引用地址改变这个地址上的值。 具体写法如下:
char a=5;
char * const k = &a; // k 将一直指向 a ,其指向的地址一直不会变了 k 不变了
*k = 10; // 解引用地址改变值,这是允许的
const char * const kk = &a; // kk 是一个指向常量对象的常量指针 不能通过解引用kk改变a的值,也不能改变kk的地址
注意理解上面两点 。