2017-06-06 18 views
0

我是新的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),它何时会从堆栈中删除?

+1

为什么没有注释的downvote? – zipzit

回答

2

这是正确的方式返回doSmth()中的foo对象吗?

当然是。

我想在堆栈

你必须创建对象。

但我关于阵列(巴)从Foo对象

bar担心不为 “从foo”。 bar是一个全局静态对象。

f.bar[1] 

这是病态形成时,由于bar不是Foo成员。要声明一个成员,它是类的定义中:

struct Foo { 
    int bar[10] = {}; 
}; 

时将它从栈中删除?

如果bar有静态存储,比如在你的代码中,那么它会在程序结束时被销毁。如果它是一个(非静态)成员,那么当它的完整对象被销毁时它被销毁,即包含它的Foo的实例。

+0

Thx很多!是不是我打算将其声明为静态对象:D 但是根据你的说法,它仍然可以用作成员,并且由于整个对象超出了范围,所以数组不会被删除,所以一切都很好! – Asssasssiino

0

如果bar是您的Foo类,则bar -content一个foo -object将是foo -object的一部分的的非静态数据成员;它将驻留在foo所在的位置(在堆栈上,在堆上),并且一旦foo被创建或销毁,它将被创建和销毁。

如果bar是一个静态数据成员,那么它将在您的完整程序中存在一次,并将“存活”直到程序结束。

0

这是否正确地返回foo对象doSmth()

是的,本地创建的对象必须由值返回。通常情况下,编译器将创建对象并将副本进行优化。您可以在此处详细了解本地返回的对象:https://isocpp.org/wiki/faq/ctors#return-local-var-by-value-optimization

我想创建堆栈的对象,但我很担心barfoo对象,当将它从栈中删除吗?

如上所述,由于返回值优化,编译器通常不会在doSmith的堆栈帧中创建此对象。此外,即使它是在doSmith的堆栈帧创建的,默认的拷贝构造函数和缺省赋值运算符的行为是这样的:

如果子对象是一个数组,每个元素分配,在适当的元素类型方式

见15.8.1 [class.copy.ctor] 14.1和15.8.2 [class.copy.assign] 12.2

+0

真的很好的解释,将阅读链接的维基文章! – Asssasssiino

+0

@Asssasssiino是的,这是C++常见问题解答,它涵盖了它几乎是关于如何在C++中完成任务的权威指南。 –

相关问题