none
const的奇怪现象(版主请进帮忙看看) RRS feed

  • 问题

  • 看范磊的视频第11章的8.1的重载加法运算函数时有一个奇怪的const的运用。

    范磊视频中此句:num add(const num&r){return num(n+r.get());}运行不报错。

    按我的理解const是不会改变的。所以const num&r将不会被改变。而其后面的{}里的n+r.get()却将其值改变了。范磊的v6.0居然能运行。我使用VS2008却报错为:错误 1 error C2662: “num::get”: 不能将“this”指针从“const num”转换为“num &” 。

    有没有哪位高手解释下究竟是什么原因造成的?

    2010年4月4日 12:06

答案

  • 多谢版主以及霸王(jimt200010)的帮助。虽然没帮上忙但是给了我解决这问题的信心。现在知道正确的用法了。不敢私藏发出来给各位初学者避免走弯路。 解决的关键在于我不太会看错误提示:“错误 1 error C2662: “num::get”: 不能将“this”指针从“const num”转换为“num &” 。”这句话的意思就是提示此代码的作者将“int get(){return n;}“这句话改成int get()const{return n;}.以便与下面的”num add(const num&r){return num(n+r.get());}“相呼应。一直以来我对范磊老师所说的const的用法总在心底里抵触(总感觉目前也写不出什么好的程序让别人来偷改数据,所以一直认为以后再学也不急)。所以,我也不知道const不只是不可改变这么简单而已。通过这个例子可以看出其实编译器已经把它视同一种类型了。有一句话不得不说的是。这个问题是我发mail给老师求得的。万分感激他居然在00:37分还在给我这么个冒冒失失的不认识的学生回这样初级的问题。(论坛没表情发了只能用言语以示对范老师的敬意了)

    • 已标记为答案 jcfu 2010年4月12日 0:56
    2010年4月12日 0:55

全部回复

  • c++2008好象不支持引用,总之跟之前的c++差别很大,所以这里会出问题。

    形参的const只是说明函数里不对这个参数进行修改,很常用。而且实际上这里也没有修改(r的引用一直没变过)


    霸王
    2010年4月4日 13:56
  • c++2008好象不支持引用,总之跟之前的c++差别很大,所以这里会出问题。

    形参的const只是说明函数里不对这个参数进行修改,很常用。而且实际上这里也没有修改(r的引用一直没变过)


    霸王

    看过您的点评,您的理解是函数功能里面的n+r.get()所返回的这个num对象并没有改变&r仅仅是返回给num add一个对象?暂且不关他是否如您所说。从num add(¥%¥¥……¥){return @#@#@¥;}中来看是num add 包含的一个或者多个对象,功能为返回一个值或者对象。是吧?从这样看起来好像跟您的分析有点不符。我是初学的。如果有什么不对的地方请指教。谢谢
    2010年4月4日 14:44
  • 没人能提出不同的或进一步的意见了吗?

    2010年4月5日 7:53
  • 继续上面的问题:我做了个实验在(因为我目前只装了2008的没用6.0的只好拿范磊的视频当成是他在6.0里面实验通过)。

    const num equal( num&r){n=r.get();cout<<"开始置换:\n";return *this; }

    这句话在6.0可以执行,在2008里面报错为:错误 1 error C2558: class“num”: 没有可用的复制构造函数或复制构造函数声明为“explicit” 。去处了const运行正常。难道版本的改变把编程的限制也直接“升级”到不能使用const?

    奇怪的现象还有在下面这句const它不报错了。运行正常:

    const num operator+( num&r){cout<<"程序运行到这了\n";return num(n+r.get());}

    希望大大们指点为盼。谢谢

    我把实验的原稿附上如下:

    #include <iostream>
    using namespace std;
    class num
    {
    public:
     num(){n=1;cout<<"构造函数执行中\n";}
     num(int i){n=i;cout<<"带参数的构造函数执行中:\n";}
     ~num(){cout<<"析构函数执行中\n";}
     num(num&s){n=s.n;cout<<"复制构造函数执行中\n";}
     int get(){return n;}
     void set(int x){n=x;}
     const num operator+( num&r){cout<<"程序运行到这了\n";return num(n+r.get());}
         num equal( num&r){n=r.get();cout<<"开始置换:\n";return *this; }
     num operator++(int o)
     {
      num temp(*this);
      ++n;
      return temp;
     }
    private:
     int n;

    };
    int main()
    {
     num one(1), two(2), three;
     //three=one.add(two);
      three=one+two;
      cout<<"one:"<<one.get()<<endl;
      cout<<"two:"<<two.get()<<endl;
      cout<<"three:"<<three.get()<<endl;
      num a(1);
       cout<<"a:\t"<<a.get()<<"\n";
      num b(8);
     cout<<"b:\t"<<b.get()<<"\n"<<endl;
      num c=one.equal(b);
     cout<<"c:"<<c.get()<<endl;
     return 0;
    }

    2010年4月5日 9:44
  • vs2003之后的c++跟之前的c++(如6.0)完全是不同的东西,别把他们同等对待。

    目前据我所知,c++6.0下的程序拿到之后的版本里,能够编译通过的一个都没有。 

    至于那个const的特殊用法,感觉没必要太过于关注,毕竟实际中用到的很少,而且也不建议写这么难看懂的代码。

    c++是强大的,但钻牛角尖甚至是钻编译器的空子就没什么必要了。


    霸王
    2010年4月7日 4:12
  • 不是很了解。不过据说VC6,似乎不怎么遵守“规则、标准”,呵呵,后来的新版VC是越来越遵守规则和标准了。

    所以,的确,不用太多研究VC6了。

    by the way,虽然我现在只用C#/VB.NET,但是上学的时候一直研究VC6(现在是都忘光了)。C++/VC++是我永远的梦想和膜拜对象。呵呵。楼主加油~



    理解的越多,需要记忆的就越少
    2010年4月11日 5:55
    版主
  • 多谢版主以及霸王(jimt200010)的帮助。虽然没帮上忙但是给了我解决这问题的信心。现在知道正确的用法了。不敢私藏发出来给各位初学者避免走弯路。 解决的关键在于我不太会看错误提示:“错误 1 error C2662: “num::get”: 不能将“this”指针从“const num”转换为“num &” 。”这句话的意思就是提示此代码的作者将“int get(){return n;}“这句话改成int get()const{return n;}.以便与下面的”num add(const num&r){return num(n+r.get());}“相呼应。一直以来我对范磊老师所说的const的用法总在心底里抵触(总感觉目前也写不出什么好的程序让别人来偷改数据,所以一直认为以后再学也不急)。所以,我也不知道const不只是不可改变这么简单而已。通过这个例子可以看出其实编译器已经把它视同一种类型了。有一句话不得不说的是。这个问题是我发mail给老师求得的。万分感激他居然在00:37分还在给我这么个冒冒失失的不认识的学生回这样初级的问题。(论坛没表情发了只能用言语以示对范老师的敬意了)

    • 已标记为答案 jcfu 2010年4月12日 0:56
    2010年4月12日 0:55