C 用数组作为成员创建对象

c++ create object with an array as member

本文关键字:成员 创建对象 数组      更新时间:2023-10-16

我是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;
}

这是返回doSmth()foo -object的正确方法吗?我想在堆栈上创建对象,但是我担心FOO对象的array (bar),什么时候会从堆栈中删除?

这是返回dosmth((中的foo对象的正确方法?

肯定是。

我想在堆栈上创建对象

你有。

,但我担心foo对象的数组(bar(

bar不是"来自foo"。bar是一个全局静态对象。

f.bar[1]

这是不适的,因为bar不是Foo的成员。要声明成员,它必须在类的定义内部:

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

什么时候将其从堆栈中删除?

如果bar具有静态存储,例如在您的代码中,则在程序结束时将其销毁。如果是(非静态(成员,则当它的完整对象被破坏时,即包含它的Foo的实例。

如果 bar是您类Foo的非静态数据成员,则bar - foo -object的 CC_13 -content将是foo -Object的一部分;它将位于foo所在的位置(在堆上,在堆上,...(,一旦foo被创建或破坏,它将被创建和破坏。

如果bar是静态数据成员,那么它将在您的完整程序中存在一次,并且将"实时"直到程序完成为止。

这是返回foo对象的正确方法?

是的,必须通过值返回本地创建的对象。通常,编译器将创建对象,并将副本优化。您可以在此处阅读有关返回本地对象的更多信息:https://isocpp.org/wiki/faq/ctors#return-local-var-var-var-var-y-value-optimization

我想在堆栈上创建对象,但是我担心foo对象的bar,何时将其从堆栈中删除?

如上所述,由于返回值优化,编译器通常不会在doSmith的堆栈帧中创建此对象。此外,即使它是在doSmith的堆栈框架中创建的,默认复制构造函数和默认分配运算符的行为也是如此:

如果子对象是数组,则以适合元素类型的方式分配每个元素

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