const好像远不是一个常量那么简单,一起来看看为什么吧?
//
const long thevalue=1234;//这就是死木头一根了,作用就是你如果在后面的代码里面给thevalue赋值,编译器会告诉你错误的;
thevalue=2345;//error C2166:l-value specifies const object如果试图赋值,这是vc给出的错误;
longp=&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如果又试图赋值,还是错误,因为指向的是常量啊,编译器知道,骗不过;
longp=(long)&thevalue;//编译正常;
*p=2345;//编译正常;
cout<<THEVALUE<<ENDL;&NBSP;p=""!_这是为虾米啊<=""1234=""得到的输出竟然是=""/>
记得看过什么地方说原来在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;//这个正常
(a=b)=c;//这个出错,为啥我没理解透,谁给说说;
//
long CA::con_func1()const{
return 13;
}
const成员函数就是不能修改成员数据的函数;如果实现这样
long CA::con_func1()const{
thevalue=2345;//error C2166:l-value specifies const object这错误又来了;在这个函数内部所有数据成员都变成const的了;
set_value(2345);//这个也不行,调用非const函数照样出错;const函数里只能调const函数
//error C2662:'set_value':cannot convert'this'pointer from'const class CA'to'class CA&'Conversion loses qualifiers
//通过这个错误,可以看出来编译器对const函数所传递的this指针是个'const class CA'
return 13;
}
//
void CA::con_func2(const char*in_str)
const类型的参数就很好理解了,就是函数内部不能修改参数的值,这只对指针和引用有效,对值传递意义不大;
值传递的话函数内部看到的只是一份拷贝而已,你爱改就改呗,反正对外面没影响;
另外就是只能对输入参数用const,对输出参数用了const就.......进去啥还出来啥,还调函数干啥....
刚弄出来就发现还有个gg写的const辨析很好,
在这里http://blog.chinaunix.com/article.php?articleId=44267&blogId=9573