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;
}
有没有哪位高手解释下究竟是什么原因造成的?