#include "stdafx.h" #include<iostream> using namespace std; /* 顶层const(top-level const)表示指针(或引用)本身是个常量。 底层const(low-level const)表示指针指的对象是一个常量。 一般当说到顶层或底层const的时候都是指针或者引用类型的,因为普通类型的const只能是底层的。 使用const的建议: 1、要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委; 2、要避免最一般的赋值操作错误,如将const变量赋值; 3、在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上; 4、const在成员函数中的用法要很好的使用; 5、不要轻易的将函数的返回值类型定为const; 6、除了重载操作符外一般不要将返回值类型定为对某个对象的const引用; */ void f1(const int a) //声明一个函数 ,a正在函数体内不可变 { //a = 10; //错误 } void f2( const int * p)//声明一个形参是指向常量整型的指针的函数,表示(*p)的值在函数内不会改变 { //*p = 10;//错误,*p的值不能改变 p= NULL; //正确,p可以变 } void f3( int * a) { } int main() { int a = 100; const int *p1 = &a; // p1 指向的内容是常量 int * const p2 = &a;// p2 是常量,不能改变指针值 // *p1 = 200;// 错误,p1指向的内容是常量 *p2 = 200; //正确 /* tips: 指向“常量”的指针不代表它所指向的内容一定是常量,只是代表不能通过解引用符(操作符*)来改变它所指向的内容。 其实通过 a = 300 仍然可改变*p1的值。 正如 const int b= 100; 此处的b并不是不能改的,可以通过指针,修改其中的值,一个道理。 int *p =(int *) &b; //强转 */ p1 = NULL;//正确 //p2 = NULL; //错误 ,p2是常量,不能改变指向 int c = 1; int *const p3 = &c;//顶层const ,表示指针p3本身是不可以改变的 const int d = 10;//顶层const , d表示是一个常量整型,d是不能够改变的 const int *p4 = &d;// 底层const , 表示p4指向的是一个常量整型,而p4本身是可以改变的 const int *p5 = &c;//底层const , 表示p5只是自觉地不会改变它指向的值,但c的值可以变,这只是它的一相情愿罢了 // int *p5 = &d;//错误,因为通过指针p3可能会改变i的值,而d是不可以被改变的 ,除非强转转换 int e= 0; f1( e );// 传入实参 e , 正确因为v,void f1(const int a)表示在f1函数中不能改变a的值,因此对实参没什么特殊要求, // 只传进去值就可以了,这样i得到这个 const int g = 0; f2(&g);//合法的 f2(&e);//合法的 , 当我们在函数内不需要改变传入的变量的值的时候,尽量使用const,这样对实参的限制更少一点。 // f3( &g );// 错误, g是不可变得,但在放f3中可以变 }
转载请注明原文地址: https://www.6miu.com/read-14848.html