2014-02-24 21 views
1

我已经摸索出了复杂的类如下:为什么我不能在复制构造函数中使用getter?

class Complex{ 
    public: 
     Complex(const Complex &); 
     double getRreal(){ 
      return real; 
     } 
    private: 
     double real, img; 
}; 

Complex::Complex(const Complex &Z){ 
    real = Z.getReal(); 
} 

然而,编译器给我一个错误:

passing ‘const Complex’ as ‘this’ argument of ‘double Complex::getReal()’ discards qualifiers

这个错误是什么意思?

顺便说一句,我知道我可以简单地使用

real = Z.real; 

复制的实部“这个”从Z,但我认为这是有线的,因为我可以访问和修改的私人数据输入对象“Z”。虽然对象Z也是类“Complex”的一个实例,但在这里我们并没有实际针对Z的“做某事”。Z仅仅是函数为对象“this”做某事的一个参数。它安全吗?

我不是母语的人。对不起,我英文很差。

+0

update'double getRreal()'to'double getRreal()const' – billz

回答

10

由于您通过const参考(如您应该),因此只能调用const方法。使吸气剂const。无论如何,没有理由不是const

double getRreal() const { 
    return real; 
} 

但是,你甚至都不需要做的是,你可以直接使用数据成员,并做在构造函数初始化列表初始化:

Complex::Complex(const Complex &Z) : real(Z.real) 
{ 
} 

或者,如果你关心虚构的部分img(我认为你是这样做的),只要让编译器生成拷贝构造函数来做它的事情,然后删除自己的东西。那将是最好的解决方案。

+0

@柏均叶它是语言的规则。强制执行'const'正确性。否则,你将能够改变应该是'const'的东西。 – juanchopanza

+0

非常感谢,我明白。 –

相关问题