我是c ++的新手(来自java),而且我实际上正在使用 以下: 让foo成为一个班级
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)
,什么时候会从堆栈中删除?
答案 0 :(得分:2)
这是在doSmth()中返回foo对象的正确方法吗?
肯定是。
我想在堆栈上创建对象
你有。
但是我担心来自foo对象的数组(bar)
bar
不是“来自foo
”。 bar
是一个全局静态对象。
f.bar[1]
由于bar
不是Foo
的成员,因此形成不良。要声明成员,它必须在类的定义中:
struct Foo {
int bar[10] = {};
};
何时从堆栈中删除?
如果bar
具有静态存储(例如代码中),则会在程序结束时销毁它。如果它是一个(非静态)成员,那么当它的完整对象被销毁时它就会被销毁,即包含它的Foo
实例。
答案 1 :(得分:0)
如果bar
是您的班级Foo
的非静态数据成员,则bar
- foo
- 对象的内容将成为foo
内容的一部分1}} - 对象;它将驻留在foo
所在的位置(在堆栈上,堆上,......),并且一旦foo
被创建或销毁,它就会被创建和销毁。
如果bar
是静态数据成员,那么它将在您的完整程序中存在一次,并且将“生效”直到程序结束。
答案 2 :(得分:0)
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