中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
const关键字
作者:未知 时间:2005-09-13 23:29 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要: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;  //编译正常;

cout<

----------------------------------------------------------

记得看过什么地方说原来在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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有