c ++使用数组作为成员创建对象

时间:2017-06-06 15:28:07

标签: c++ arrays object

我是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),什么时候会从堆栈中删除?

3 个答案:

答案 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