C ++:返回一个对象并将其分配给一个函数

时间:2018-05-19 21:12:02

标签: c++ function object return-value variable-assignment

我是C ++的初学者,我想做这样的事情:

myObj f(){
    // do stuff 
    // return instance of myObj
}

int main(){
    // do stuff
    myObj mO = f(); 
}

我需要做些什么才能在C ++中使用它?

我的想法是,我必须为myObj stuct /类实现一个assign运算符,或者编写另一个类似于myObj::myObj(myObj mO){...}的构造函数,我使用它myObj = myObj(f());

这是对的吗?

我是否还需要做更多工作?

你能提供一个有效的例子吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

这几乎可以按原样编译。

//define a class
class myObj {};

// return an instance of the class
myObj f() {
    return myObj{};
}

// call with the same main as in the question:
int main(){
    // do stuff
    myObj mO = f(); 
}

答案 1 :(得分:0)

C ++为您定义了一个复制构造函数,一个赋值运算符和一个移动构造函数,如果这可以简单地完成的话;在这些情况下,你应该不做任何事情,只需返回一个对象实例,调用者就可以得到它。

如果对象有一些无法复制的部分(例如引用),那么你需要自己提供复制构造函数和赋值(但可能不应该复制或分配类)。

还有其他限制阻止自动合成移动构造函数(以避免错误)。

另请注意,在某些情况下,C ++编译器将合成复制构造函数和赋值,但使用错误的代码。你需要小心(例如,如果类包含裸露的拥有指针)。

对于一个简单的案例,其中一切都是开箱即用而无需做任何事情,请考虑:

// A bi-dimensional point
struct P2d {
    double x, y;
};

// Computes the middle point given two points
P2d average(P2d a, P2d b) {
    return P2d{(a.x+b.x)/2, (a.y+b.y)/2};
}

如您所见,课程中不需要支持返回P2d值或接受P2d参数。

在这种情况下,编译器会自动将定义代码完成为:

struct P2d {
    double x, y;

    P2d(const P2d& other)
      : x(other.x), y(other.y)
    {
    }

    P2d& operator=(const P2d& other) {
        x = other.x;
        y = other.y;
        return *this;
    }

    ~P2d() {
    }
};