【问题标题】:c++ create object with an array as memberc ++创建以数组为成员的对象
【发布时间】:2017-06-06 15:28:07
【问题描述】:

我是 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 对象的正确方法吗? 我想在堆栈上创建对象,但我担心 foo 对象中的array (bar),它什么时候会从堆栈中删除?

【问题讨论】:

  • 为什么在没有 cmets 的情况下投反对票?

标签: c++ arrays object


【解决方案1】:

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

确实如此。

我想在堆栈上创建对象

你有。

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

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

f.bar[1]

这是不正确的,因为bar 不是Foo 的成员。要声明一个成员,它必须在类的定义中:

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

什么时候从堆栈中删除?

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

【讨论】:

  • 非常感谢!我不是打算将它声明为静态对象 :D 但是根据您的说法,它仍然可以用作成员,并且由于整个对象超出范围,因此不会删除该数组,所以一切都很好!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    是的,本地创建的对象必须按值返回。通常,编译器将在适当位置创建对象,并且副本将被优化。您可以在此处阅读有关返回本地对象的更多信息: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 是的,这就是 C++ 常见问题解答,它所涵盖的深度几乎是关于如何在 C++ 中完成任务的权威指南。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2019-10-24
    • 2023-04-09
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多