const使用辨析_const long

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{
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' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值