由函数return

时间:2018-06-04 00:58:55

标签: c++ constructor return-value

我无法理解为什么我无法在下面的一行中初始化我的类对象。 获得对我来说不简单的VS错误:

“错误:E0334类”示例“没有合适的复制构造函数”

“C2440'初始化':无法从'example'转换为'example'”

一些代码:

class example {
public:
    example() { R = 0.F; I = 0.F; };
    example(float, float);
    example(example &);
    example sum( float, float);
private:
    float R, I;
};

example::example(float s1, float s2):R(s1), I(s2) {}

example::example(example & ex2) {
    R = ex2.R;
    I = ex2.I;
}

example example::sum(float s1, float s2){
    example s;
    s.R = s1;
    s.I = s2;
    return s;
}

int main() {
    float a = 2;
    float b = 4;
    example object1(1,1);
    example object2(object1.sum(a,b));
    return 0;
}

为什么要像这样初始化object2

example object2(object1.sum(a,b));

得到错误,但是像这样:

example object2;
object2 = (object1.sum(a,b));

传递没有错误,是吗?

2 个答案:

答案 0 :(得分:1)

您在copy constructor

中错过了const
example(example const &);
  

为什么要像这样初始化object2:

example object2(object1.sum(a,b));
     

收到错误

因为您无法从右值object1.sum(a,b)获得非const引用。

  

但是这样的事情:

example object2;
object2(object1.sum(a,b));
     

好吗?

此代码也有误,第二行需要operator ()

答案 1 :(得分:0)

example object2(object1.sum(a,b));

这不是复制构造函数,这是移动构造函数,因为参数是rvalue。

所以,你可以像这样明确地添加移动构造函数。

class example {
public:
    example() { R = 0.F; I = 0.F; };
    example(float, float);
    example(example &);
    //move
    example(example &&);
    example sum( float, float);
private:
    float R, I;
};

example::example(float s1, float s2):R(s1), I(s2) {}

example::example(example & ex2) {
    R = ex2.R;
    I = ex2.I;
}

example::example(example && ex2){
    R = ex2.R;
    I = ex2.I;
}

example example::sum(float s1, float s2){
    example s;
    s.R = s1;
    s.I = s2;
    return s;
}

int main() {
    float a = 2;
    float b = 4;
    example object1(1,1);
    example object2(object1.sum(a,b));
    return 0;
}

和这个

example object2;
object2 = (object1.sum(a,b));

没问题,因为它会调用编译器自动生成的复制赋值运算符(当你添加像我这样的移动构造函数时,编译器不会生成复制赋值运算符)