ITPub博客

首页 > IT职业 > IT职场 > 物联网学习教程—const关键字

物联网学习教程—const关键字

IT职场 作者:千锋教育官方 时间:2019-08-23 17:36:08 0 删除 编辑

 

  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<<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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69914734/viewspace-2654761/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
千锋IT职业教育——做真实的自己 用良心做教育

注册时间:2019-03-28

  • 博文量
    140
  • 访问量
    92339