今天来说一说,const关键字,不知道大家对它理解咋样
const远不是一个常量那么简单
首先:
const long thevalue = 1234; //这就是死木头一根了,作用就是你如果在后面的代码里面给thevalue赋值,编译器会告诉你错误的;thevalue = 2345; // error C2166: l-value specifies const object 如果试图赋值, 这是vc给出的错误;
long * p = &thevalue; //error C2440: 'initializing' : cannot convert from 'const long *' to 'long *' Conversion loses qualifiers
试图用一个普通指针指向常量,不行;
正确写法:
const long * p = &thevalue; //编译正常;
然后:
*p = 2345; //error C2166: l-value specifies const object 如果又试图赋值,还是错误,因为指向的是常量啊,编译器知道,骗不过;
正确写法:
long * p =(long *) &thevalue; //编译正常;*p = 2345; //编译正常;
记得看过什么地方说原来在C里面常量一般用
#define XXX_XXX_XXXX xx 这样来用,在预编译的时候处理掉;
好像怎么着了不如c++的const爽,大概就因为c++类型检查严格吧;
const还有比较特殊的地方就是运用到类里面;
class CA{ long thevalue;public: const long thevalue1; void set_value(long val); const char * con_func(); //返回值是常量 long con_func1() const; //const 成员函数 void con_func2(const char * in_str); //使用const 参数 CA(); ~CA();};void CA::set_value(long val){ thevalue = val;}
const char * CA::con_func(){ return some address;}
被函数返回的地址是不可以被修改的; 大概c++编译器认为 char* 和const char* 根本不是一种类型;
CA ca;char * p = ca.confunc(); //所以这里编译不通过;
正确写法:
const * p = ca.confunc(); //编译通过;
如果有这样个函数 const long CA::con_func_value() 直接返回数值而不是地址或引用,那么,据说这样没有意义;
因为,返回值仅仅是一份临时拷贝,返回之后保存该值的临时对象就消失了,也没有谁有机会去修改它;
如果函数返回一个引用,据说不常见 ;
CA & operate = (const CA &other); 赋值函数是这样子的,好像没什么别的地方用引用返回了;
如果变成这样 const CA & operate = (const CA &other); 会影响连续赋值
CA a,b,c;
a=b=c; //这个正常
long CA::con_func1() const{ return 13;}
const成员函数就是不能修改成员数据的函数;如果实现这样
long CA::con_func1() const
void CA::con_func2(const char * in_str)
const类型的参数就很好理解了,就是函数内部不能修改参数的值,这只对指针和引用有效,对值传递意义不大;
值传递的话函数内部看到的只是一份拷贝而已,你爱改就改呗,反正对外面没影响;
另外就是只能对输入参数用const,对输出参数用了const就.......进去啥还出来啥,还调函数干啥....
先就这些吧,欢迎大家补充!