标题:const的奇怪现象
只看楼主
jcfu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-4-5
结帖率:0
已结贴  问题点数:20 回复次数:5 
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
asdjc
Rank: 6Rank: 6
来 自:武汉
等 级:侠之大者
威 望:7
帖 子:98
专家分:487
注 册:2010-1-22
得分:6 
你的东西太多了,这样吧,
const有三种用法,
1.用于定义函数,
2.用于定义变量,
3.用于定义函数的变量,如(const a)。
2010-04-09 14:29
ltyjyufo
Rank: 9Rank: 9Rank: 9
来 自:未来
等 级:蜘蛛侠
威 望:2
帖 子:353
专家分:1166
注 册:2009-10-25
得分:6 
  const 和define相似......

翱翔天空的雄鹰固然令人羡慕,却容易被禁锢于牢笼之中,只有那夜色中的蝙蝠才是真正自由的飞翔者....
2010-04-09 22:43
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:6 
num add(const num&r){return num(n+r.get());}
这里要让r.get()编译通过,需要修改get函数:
const int get()const{return n;}
而且,这句话并没有修改r,只是使用构造器num(int i)返回了一个num对象。
2010-04-10 19:24
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:0 
第二个错误是因为:
num c=one.equal(b);
这里没有合适的复制构造器,由于右式是一个const 类型,而构造器中没有匹配的,可以这样改:
将构造函数:num(num&s)改为:num(const num&s)
2010-04-10 19:32
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:0 
由于VS2008对语法的检查更为严格,可以说是一个好的语法教师,如果你写违背语法的代码,它就会报出错误或是警告(严格的说,警告也是错误,只是警告一般可以不出错,但在极端条件下,它一样可以使程序崩掉,所以严格的商业软件最好不要存在警告。)所以如果能保证代码在VS2008上没有错误和警告的,基本可以算是一个合格的程序员了,而在解决这些错误和警告的过程,正是你一步步纠正自己C++语法的过程,也是一个绝佳的学习过程。
2010-04-10 19:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-301775-1-1.html




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

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