我是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());
。
这是对的吗?
我是否还需要做更多工作?
你能提供一个有效的例子吗?
谢谢!
答案 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() {
}
};