C++创建的对象与一个数组作为构件
我是新的C++(从Java来)和我实际上与 struggeling以下: 让FOO是类C++创建的对象与一个数组作为构件
int bar[10] = {};
Foo::Foo()
{
bar[1] = 42;
}
和doSmth()在主类中的方法:
Foo doSmth(){
Foo f;
f.bar[0] = 10;
return f;
}
主要会是这样的:
int main(int argc, char *argv[])
{
Foo f = doSmth();
cout << f.bar[1] << endl;
cout << f.bar[0] << endl;
return 0;
}
这是否正确地返回foo
- 对象doSmth()
? 我想在堆栈上创建对象,但我担心foo对象中的array (bar)
,它何时会从堆栈中删除?
这是正确的方式返回doSmth()中的foo对象吗?
当然是。
我想在堆栈
你必须创建对象。
但我关于阵列(巴)从Foo对象
bar
担心不为 “从foo
”。 bar
是一个全局静态对象。
f.bar[1]
这是病态形成时,由于bar
不是Foo
成员。要声明一个成员,它是类的定义中:
struct Foo {
int bar[10] = {};
};
时将它从栈中删除?
如果bar
有静态存储,比如在你的代码中,那么它会在程序结束时被销毁。如果它是一个(非静态)成员,那么当它的完整对象被销毁时它被销毁,即包含它的Foo
的实例。
Thx很多!是不是我打算将其声明为静态对象:D 但是根据你的说法,它仍然可以用作成员,并且由于整个对象超出了范围,所以数组不会被删除,所以一切都很好! – Asssasssiino
如果bar
是您的Foo
类,则bar
-content一个foo
-object将是foo
-object的一部分的的非静态数据成员;它将驻留在foo
所在的位置(在堆栈上,在堆上),并且一旦foo
被创建或销毁,它将被创建和销毁。
如果bar
是一个静态数据成员,那么它将在您的完整程序中存在一次,并将“存活”直到程序结束。
这是否正确地返回foo
对象doSmth()
?
是的,本地创建的对象必须由值返回。通常情况下,编译器将创建对象并将副本进行优化。您可以在此处详细了解本地返回的对象:https://isocpp.org/wiki/faq/ctors#return-local-var-by-value-optimization
我想创建堆栈的对象,但我很担心bar
从foo
对象,当将它从栈中删除吗?
如上所述,由于返回值优化,编译器通常不会在doSmith
的堆栈帧中创建此对象。此外,即使它是在doSmith
的堆栈帧创建的,默认的拷贝构造函数和缺省赋值运算符的行为是这样的:
如果子对象是一个数组,每个元素分配,在适当的元素类型方式
见15.8.1 [class.copy.ctor] 14.1和15.8.2 [class.copy.assign] 12.2
真的很好的解释,将阅读链接的维基文章! – Asssasssiino
@Asssasssiino是的,这是C++常见问题解答,它涵盖了它几乎是关于如何在C++中完成任务的权威指南。 –
为什么没有注释的downvote? – zipzit