| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 664 人关注过本帖
标题:const的奇怪现象
取消只看楼主 加入收藏
jcfu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-4-5
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
const的奇怪现象
看范磊的视频第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 &” 。

继续上面的问题:我做了个实验在(因为我目前只装了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它(2008)不报错了。运行正常:

const num operator+( num&r){cout<<"程序运行到这了\n";return num(n+r.get());}
但是如果将这句改写成:const num operator+(const num&r){cout<<"程序运行到这了\n";return num(n+r.get());}2008就报错了v6还是一样运行正常

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

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

#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;
}



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

搜索更多相关主题的帖子: const 现象 
2010-04-05 18:04
快速回复:const的奇怪现象
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016586 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved