报错代码
#include<iostream>
using namespace std;
class Complex{
private:
double r,i;
public:
Complex(double _r,double _i=0):r(_r),i(_i){}
double re() {return r;}
double im() {return i;}
void print(){
cout << r << "+" << i << "i";
}
friend Complex operator+(const Complex& a,const Complex& b){
return Complex(a.re()+b.re(),a.im()+b.im());
}
};
int main(){
Complex a(0,0) , b(1,0.5);
for (int i=0;i<10;++i){
a = a + b + b;
}
a.print();
return 0;
}
报错
以下截取部分报错信息:
error: passing ‘const Complex’ as ‘this’ argument discards qualifiers [-fpermissive]
14 | return Complex(a.re()+b.re(),a.im()+b.im());
原因
在重载加号的函数中 (operator+()),函数参数修饰为 const 型。但 const 类只能访问 const 型成员函数(已经修饰为不改变其数据的成员函数)。
解决方案
将涉及到的成员函数修饰为 const 成员函数,注意 const 应该放在声明 / 定义的后面(跟在传入参数的后面)!
具体如下第八、第九行。
#include<iostream>
using namespace std;
class Complex{
private:
double r,i;
public:
Complex(double _r,double _i=0):r(_r),i(_i){}
double re() const {return r;} // declare it as const
double im() const {return i;} // declare it as const
void print(){
cout << r << "+" << i << "i";
}
friend Complex operator+(const Complex& a,const Complex& b){
return Complex(a.re()+b.re(),a.im()+b.im());
}
};
int main(){
Complex a(0,0) , b(1,0.5);
for (int i=0;i<10;++i){
a = a + b + b;
}
a.print();
return 0;
}
如上修改 re() 与 im() 为const成员函数后,成功运行,输出 20+10i